转载:信号的三种状态及信号集函数
地址: https://blog.youkuaiyun.com/xiaodu655/article/details/80246440
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
参数1:对哪个信号捕捉
参数2:信号的动作
参数3:信号原有的动作 //如果不关心原有的屏蔽字 传NULL
struct sigaction {
void (*sa_handler)(int);//捕捉函数,参数只能传int类型,返回值为空
void (*sa_sigaction)(int, siginfo_t *, void *);//与第一个函数指针互斥,只能设置一个
sigset_t sa_mask;//设置阻塞信号集,比如执行5号信号,3号信号传过来,将3号信号设
置sa_mask信号集中;调用捕捉函数,临时使用这个信号集作信号屏蔽字 捕捉函数执行完
之后,临时信号集解除,恢复原有的阻塞信号集
int sa_flags;//通过这个参数指定调用哪个函数
void (*sa_restorer)(void);//保留,已过时了
};
#include<stdio.h>
#include<signal.h>
void do_sig(int num){
int n=5;
printf("i am do_sig\n",num);
while(n--){
printf("num=%d\n",num);
sleep(1);
}
}
int main(void){
struct sigaction act;
act.sa_handler=do_sig;//SIG_DFL 默认动作 SIG_IGN忽略
//操作信号集,用信号集处理函数
sigemptyset(&act.sa_mask);//信号集清0
//sigaddset(&act.sa_mast,SIGQUIT) 阻塞其他信号
act.sa_flags=0;//等于0 调用(*sa_handler)(int);
sigaction(SIGINT,&act,NULL);
while(1){
printf("**************\n");//默认打印这一行,安Ctrl+c 执行捕捉函数 Ctrl+\退出
sleep(1);
}
return 0;
}