Linux子进程信号丢失

时间:2013-11-30 20:08:57

标签: c signals posix

我有两个子进程和一个父进程。两个孩子同时发送SIGUSR1信号。处理程序只处理其中一个,父级也只接收其中一个。我认为它可以通过使用实时信号来解决,但我现在不知道如何去做。谢谢您的帮助。

void handler(int signalnumber)
{
   //do stuff
}
int main()
{
   sigset_t blockset;
   sigfillset(&blockset);

   struct sigaction action;
   action.sa_handler = handler;
   sigemptyset(&action.sa_mask);
   sigaction(SIGUSR1, &action, NULL);

   pid_t pid = getpid();
   pid_t pids[2];

   for(i = 0; i < 2; ++i)
   {
      if(getpid() == pid)
         pids[i] = fork();
   }

   if(getpid() != pid)
   {
       while(1)
       {
           kill(getppid(), SIGUSR1);
       }
   } else
   {
      while(1)
      {
          sigdelset(&blockset, SIGUSR1);
          sigsuspend(&blockset);
          //do stuff
      }
   }
}

编辑:我用SIGRTMIN + 1替换了SIGUSR1。现在处理程序接收两个信号,但父接收器不接收。 (我想,因为它不等待任何。)

1 个答案:

答案 0 :(得分:0)

来自man sigaction

sa_mask specifies a mask of signals  which  should  be  blocked  (i.e.,
added  to  the signal mask of the thread in which the signal handler is
invoked) during execution of the signal handler.  In addition, the sig‐
nal  which triggered the handler will be blocked, unless the SA_NODEFER
flag is used.`

所以,使用SA_NODEFER。