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,但我想确保应用程序在这方面是健壮的.
那么如果在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()阻止和解除阻塞信号.