我有一个带有信号处理程序的程序:
signal(SIGINT, signalhandler);
然后程序分叉和孩子需要一个不同的信号处理程序,所以:
pid = fork();
/* What happens here? */
if(pid==0)
{
signal(SIGINT, signalhandler_for_child);
}
那么如果在fork之后但在分配新的签名处理程序之前调用SIGINT会发生什么?
这可能发生,或者在孩子获得新的信号处理程序之前不可能被打断。
如果有可能的话。我如何将信号排队到孩子身上,以便有时间获得新的处理程序?
我知道概率(如果存在的话)必须几乎为0,但我想确保应用程序在这方面是健壮的。
答案 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有用。