我有这个代码,我使用sigaddset和sigaction.但是如果我评论segaddset,结果是一样的
struct sigaction act;
act.sa_handler = process_alarm;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
//sigaddset(&act.sa_mask,SIGINT);
sigaction(SIGALRM,&act,NULL);
for(;;)
{
alarm(3);
pause();
}
我为什么需要使用它?
最佳答案
你在这做两件事:
>填充sigset_t. sigset_t只是信号值的集合,用于各种系统调用.您可以:
>创建一个空的sigset_t(sigemptyset()
>向集合添加信号(sigaddset())
>删除信号到集合(sigdelset())
>等……
>设置信号处理程序的信号掩码.当您通过调用sigaction()设置信号处理程序时,可以通过操作struct sigaction的sigset_t sa_mask成员来实现.
信号处理程序的信号掩码意味着当信号处理程序正在执行时,掩码中的信号将被阻塞 – 即只要它们被阻塞就不会处理这些信号.信号处理程序完成后,信号输入将被解除阻塞.
被阻止的信号不会“丢失”,当特定信号再次被阻塞时,它将被处理.
sigaddset(& act.sa_mask,SIGINT);表示SIGALRM处理程序的代码运行时不会发生SIGINT信号.
另一方面,如果你注释掉sigaddset(& act.sa_mask,SIGINT);,你只剩下一个用sigemptyset(& act.sa_mask);创建的信号的空列表.因此,在SIGALRM处理程序函数运行时发生的任何信号都可能抢占该处理程序并执行该另一个信号的信号处理程序.
对于SIGINT,您通常不会注意到与手动测试有任何区别 – 当您的SIGALRM处理程序正在运行时,您不可能设法完全按CTRL-C,并且您的SIGALRM处理程序可能运行得足够快,如果SIGINT是,则您不会注意到稍微延迟了.