c – sigaddset用于什么?

我有这个代码,我使用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是,则您不会注意到稍微延迟了.

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...