屏蔽系统信号
程序执行后,会循环打印未决信号集000----0000(32位),如果有相应信号输入,如ctrl+c,因为SIGINT被屏蔽,未决信号集中对应3号位置一直置为1(信号被屏蔽,无法被处理,处于未决状态),打印变为001-----0000(32),其他信号类似。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<signal.h>
void printped(sigset_t* ped)
{
int i;
for(i=1;i<=32;i++)
{
if(sigismember(ped,i)==1)//检查信号是否在信号集中,未决信号
putchar('1');
//触发SIGQUIT信号时,因为被屏蔽,所以未决信号集3号位一直为1.
else
putchar('0');
}
printf("\n");
}
int main(void)
{
sigset_t myset ,oldset,ped;
sigemptyset(&myset); //创建自定义集合set
sigaddset(&myset,SIGQUIT); //把集合中3号位置1,ctrl+\产生SIGQUIT信号
// sigaddset(&myset,SIGINT); //把集合中2号位置1,ctrl+c产生SIGINT信号
//sigaddset(&myset,SIGTSTP); //把集合中20号位置1,ctrl+z产生SIGTSTP信号
sigaddset(&myset,SIGSEGV); //段错误,kill -11 pid 发送信号
sigaddset(&myset,SIGKILL); //杀死程序,老大哥无法屏蔽
sigprocmask(SIG_BLOCK,&myset,&oldset);//设定myset对应到系统屏蔽字集合
//此处相当于myset|mask,3号SIGQUIT被屏蔽
while(1)
{
sigpending(&ped);//ped传出参数,保存信号集
printped(&ped);//打印未决信号集
sleep(1);
}
return 0;
}