900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > alarm中断慢系统调用

alarm中断慢系统调用

时间:2022-04-15 17:12:42

相关推荐

alarm中断慢系统调用

1. 背景

在阻塞系统调用中,我们经常会遇到一种系统调用返回过慢或永远阻塞的情况。此时我们需要让系统调用能够快速返回,提高系统整体性能。我们可以利用中断机制,使得系统调用被中断而成功返回。

2. 原理

利用alarm函数为进程注册一个闹钟,当闹钟被系统唤醒时将,系统会将SIGALRM信号回馈给进程。SIGALRM信号的默认操作是终止进程。为了让进程不终止,需要利用sigaction函数向系统注册信号处理函数(此处为啥不用signal注册信号处理函数)。

3. sigaction & signal异同点

相同点 均能向系统注册信号处理函数异同点 signal注册信号处理函数,系统调用会自动重启而不会返回sigaction 默认情况下系统调用不会自动重启,函数将返回错误码并值errno为EINTR只有中断信号的SA_RESTART标志有效时,系统调用才会自动重启

4. 实例

#include <stdio.h>#include <signal.h>#include <unistd.h>#include <errno.h>#include <string.h>static void null_sig_handler(int sig){}#if 1static struct sigaction sig_handler = {.sa_handler = null_sig_handler,};#endifint main(int argc, const char *argv[]){char buffer[128] = {0};#if 1sigaction(SIGALRM, &sig_handler, NULL);#elsesignal(SIGALRM, null_sig_handler);#endiffor (; ; ) {alarm(2);int len = read(STDIN_FILENO, buffer, sizeof(buffer));printf("len[%d], %s\n", len, strerror(errno));}return 0;}

5. 输出结果

len[-1], Interrupted system calllen[-1], Interrupted system calllen[-1], Interrupted system calllen[-1], Interrupted system calllen[-1], Interrupted system calllen[-1], Interrupted system calllen[-1], Interrupted system call

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。