linux内核会发射一些信号,应用程序可以捕捉信号执行特定函数
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 成功:0;失败:-1,设置errno
act:传入参数,新的处理方式。oldact:传出参数,旧的处理方式。
struct sigaction结构体 struct sigaction { void(*sa_handler)(int);
sigset_t sa_mask; int sa_flags; };
① sa_handler:指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略 或 SIG_DFL表执行默认动作
② sa_mask: 调用信号回调函数时,所要屏蔽的信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,是临时性设置。用sigaddset函数添加需要被捕捉的信号。
③ sa_flags:通常设置为0,表使用默认属性:为0的时候,可以屏蔽正在处理的信号(若在处理2号信号时又有2号信号,则此时传来的2号信号会被屏蔽)。
#include <stdlib.h> #include <stdio.h> #include <signal.h> void func(int signal) { printf("%d号信号被捕捉。 ", signal); } int main(void) { struct sigaction act, oldact; act.sa_handler = func; act.sa_flags = 0; sigemptyset(&act.sa_mask);//sa_mask是一个临时信号集,将其清零(初始化I) sigaddset(&act.sa_mask, SIGQUIT);//将3号信号添加到信号集,即:3号信号就是我们在处理2号信号的时候需要屏蔽的那个信号,也可以添加其他信号,比如20号信号 sigaddset(&act.sa_mask, SIGTSTP); int s_ret = sigaction(SIGINT, &act, &oldact); if (0>s_ret) { perror("sigaction error"); exit(1); } while (1); return 0; }