关于使用 sigaction捕捉信号返回的问题,sa_flags 中的 SA_RESTART 宏
/* #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); - 功能:检查或者改变信号的处理。信号捕捉 - 参数: - signum : 需要捕捉的信号的编号或者宏值(信号的名称) - act :捕捉到信号之后的处理动作 - oldact : 上一次对信号捕捉相关的设置,一般不使用,传递NULL - 返回值: 成功 0 失败 -1 struct sigaction { // 函数指针,指向的函数就是信号捕捉到之后的处理函数 void (*sa_handler)(int); // 不常用 void (*sa_sigaction)(int, siginfo_t *, void *); // 临时阻塞信号集,在信号捕捉函数执行过程中,临时阻塞某些信号。 sigset_t sa_mask; // 使用哪一个信号处理对捕捉到的信号进行处理 // 这个值可以是0,表示使用sa_handler,也可以是SA_SIGINFO表示使用sa_sigaction int sa_flags; // 被废弃掉了 void (*sa_restorer)(void); }; */ #include <sys/time.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> void myalarm(int num) { printf("捕捉到了信号的编号是:%d\n", num); printf("xxxxxxx\n"); } // 过3秒以后,每隔2秒钟定时一次 int main() { struct sigaction act; act.sa_flags = 0; act.sa_handler = myalarm; sigemptyset(&act.sa_mask); // 清空临时阻塞信号集 // 注册信号捕捉 sigaction(SIGALRM, &act, NULL); struct itimerval new_value; // 设置间隔的时间 new_value.it_interval.tv_sec = 2; new_value.it_interval.tv_usec = 0; // 设置延迟的时间,3秒之后开始第一次定时 new_value.it_value.tv_sec = 3; new_value.it_value.tv_usec = 0; int ret = setitimer(ITIMER_REAL, &new_value, NULL); // 非阻塞的 printf("定时器开始了...\n"); if(ret == -1) { perror("setitimer"); exit(0); } // getchar(); // 使用 getchar() 函数阻塞进程时,使用 sigaction 处理信号返回后,若不设置 sa_flags 为 SA_RESTART,则进程终止。 while(1); return 0; }
在执行while(1) 类似循环时,使用 sigaction 捕捉信号返回后,循环继续执行,如果使用 getchar() 阻塞进程时,程序捕捉到信号并返回,程序会中止,可设置 sigaction 中 sa_flags 为 SA_RESTART 来解决。
https://blog.csdn.net/fan_Mk/article/details/123638182