父母和孩子的不同的信号处理程序

时间:2018-03-21 10:35:59

标签: c signals interrupt

我有一个带有信号处理程序的程序:

signal(SIGINT, signalhandler);

然后程序分叉和孩子需要一个不同的信号处理程序,所以:

pid = fork();

/* What happens here? */

if(pid==0)
{
signal(SIGINT, signalhandler_for_child);
}

那么如果在fork之后但在分配新的签名处理程序之前调用SIGINT会发生什么?

这可能发生,或者在孩子获得新的信号处理程序之前不可能被打断。

如果有可能的话。我如何将信号排队到孩子身上,以便有时间获得新的处理程序?

我知道概率(如果存在的话)必须几乎为0,但我想确保应用程序在这方面是健壮的。

1 个答案:

答案 0 :(得分:8)

  

那么如果在fork之后但在分配新的签名处理程序之前调用SIGINT会发生什么?

将调用父项中安装的信号处理程序。子进程继承它。

  

这可能发生,或者在孩子获得新的信号处理程序之前不可能被打断。

可能会发生。

  

如果有可能的话。我如何将信号排队到孩子身上,以便有时间获得新的处理程序?

要确保,您需要在调用fork()之前阻止SIGINT ,然后为SIGINT重新安装另一个 在子进程中然后取消阻止SGINT。

/* block SIGINT here. */

pid = fork();

if (pid == 0) {
    /* Install a new SIGINT handler here. */
    /* Unblock SIGINT. */
    ...
} else if (pid > 0) {
   /* The SIGINT handler is already in place. So just unblock SIGINT. */
   ...
} else {
   /* error */
}

请查看sigprocmask()pthread_sigmask()以阻止和取消阻止信号。

您可能还会发现GNU documentation on signal blocking有用。