简体   繁体   中英

Linux child process signal loss

I have two child processes and one parent process. The two child send a SIGUSR1 signal at the same time. The handler handles only one of them, and the parent receives only one of them too. I think it can be solved by using real time signal, but i don't now how to do it. Thank you for your help.

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
      }
   }
}

Edit: I replaced SIGUSR1 with SIGRTMIN+1. Now the handler receives both signals, but the parent does not. (I think, because it's not waiting for any.)

From 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.`

So, use SA_NODEFER.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM