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

Dan*_*ega 7 c signals interrupt

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

signal(SIGINT, signalhandler);
Run Code Online (Sandbox Code Playgroud)

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

pid = fork();

/* What happens here? */

if(pid==0)
{
signal(SIGINT, signalhandler_for_child);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

P.P*_*.P. 9

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

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

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

可能会发生.

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

要确保,您需要调用之前阻止SIGINT fork(),然后在子进程中重新安装另一个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 */
}
Run Code Online (Sandbox Code Playgroud)

查看sigprocmask()pthread_sigmask()阻止和解除阻塞信号.

您还可以找到有关信号阻塞GNU文档.

  • 一旦取消阻止,任何在被阻止时收到的信号都将被发送.这没什么好看的 - 这就是"标准"的方式. (4认同)