Unix信号之sigaction函数
sigaction函数是除signal函数之外的另一个可以设置信号处理的函数。sigaction用法比signal函数复杂,但是可以对信号处理进行更加精准更灵活的控制。sigaction是POSIX的信号接口,而signal函数是标准C的信号接口,所以sigaction函数的可移植性更强。
sigaction函数说明
函数功能
检查或修改与指定信号相关联的处理动作,可以同时检查和修改。
函数原型
1 2 3 4 5 6 7 8
| struct sigaction{ void (*sa_handler)(int); sigset_t sa_mask; int sa_flag; void (*sa_sigaction)(int,siginfo_t*,void*); }; int sigaction(int signo,const struct sigaction*restrict act,struct sigaction*restrict oact);
|
函数参数
上述struct sigaction中sa_flag取值说明(常用的有以下两个):
- SA_NODEFER:当信号处理函数正在进行时,不堵塞对于信号处理函数自身信号功能。
- SA_RESETHAND:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数
函数返回值
- 0 : 返回0表示设置成功
- -1 : 返回-1表示设置失败
函数示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> void sighandler(int sig) { printf("this is in the sig handler\n"); for (int i = 0; i < 5; i++) { printf("num:%d\n", i); } } int main() { struct sigaction act; struct sigaction oldact; act.sa_handler = sighandler; act.sa_flags = SA_NODEFER ; sigaction(SIGINT , &act,&oldact); printf ("this is the main function\n"); pid_t pid = getpid(); printf("%d", pid); kill(pid, SIGINT); }
|
Comment and share