我在使用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()来设置信号处理程序时,通过操作sigset_t sa_maskstruct sigaction成员来实现此目的。

  • 信号处理程序的信号掩码表示在执行信号处理程序时,掩码中的信号将被阻塞-即,只要阻塞它们就不会对其进行处理。当信号处理程序完成时,信号输入将被解除阻塞。
    被阻止的信号不会“丢失”,当再次取消阻止该特定信号时,将对其进行处理。
    sigaddset(&act.sa_mask, SIGINT);表示在运行SIGALRM处理程序的代码时,不会发生SIGINT信号。

    另一方面,如果您注释掉sigaddset(&act.sa_mask, SIGINT);,则只剩下一个用sigemptyset(&act.sa_mask);创建的信号的空白列表。因此,在运行SIGALRM处理程序功能时发生的任何信号都可能抢占该处理程序并对该其他信号执行信号处理程序。

    对于SIGINT,您通常不会注意到手动测试有什么不同-在运行SIGALRM的处理程序时,您不太可能设法准确地按CTRL-C,并且SIGALRM处理程序可能运行得足够快,以至于您不会注意到SIGINT是否在运行。稍有延迟。

    关于c - sigaddset的作用是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27227585/

    10-12 14:29