sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)
给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact
int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact); |
结构sigaction定义如下:
struct sigaction{ |
sa_handler字段包含一个信号捕捉函数的地址
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。
sa_flag是一个选项,主要理解两个
SA_INTERRUPT 由此信号中断的系统调用不会自动重启 SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针 |
最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。
举个例子:
#include <stdio.h>
#include<stdarg.h>
#include<stdlib.h>
#include<signal.h>
#include<errno.h>
void err_show(int sig)
{
puts("Ctr+c error\n");
exit(1);
}
int catch_sig(int sig,void(*handler)(int))
{
struct sigaction action;
action.sa_handler = handler;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
return sigaction(sig,&action,NULL);
}
int main(int argc ,char *argv[])
{
if(catch_sig(SIGINT,err_show)==-1)
{
fprintf(stderr,"error:%i\n",strerror(errno));
exit(2);
}
char in[10];
scanf("%9s",in);
return 0;
}