The GNU C Library Reference Manual有一整章解释有关的信号处理一切。
当您安装您自己的处理程序时,您总是会获得先前设置的信号处理程序(函数指针)(请参阅signal()
或sigaction()
的联机帮助页)。
previous_handler = signal(SIGINT, myhandler);
一般的规则是,你可以总是重置到前面的处理程序和raise()
的信号。
void myhandler(int sig) {
/* own stuff .. */
signal(sig, previous_handler);
raise(sig);
/* when it returns here .. set our signal handler again */
signal(sig, myhandler);
}
有一个的一般规则的缺点:被映射到信号的硬件异常通常被分配给一个特定的指令,该指令引起异常。所以,当你再次发出信号时,相关的指令与原来的不一样。这可以但不应该伤害其他信号处理程序。
另一个缺点是,每个提出的信号造成了大量的处理时间。为了防止过度使用raise()
您可以使用下列选项:
在SIG_DFL
函数指针点的情况下,解决0
(这显然是没有有效的地址)。因此,你必须重新设置处理程序和raise()
的信号。
if (previous_handler == SIG_DFL)
{
signal(sig, SIG_DFL);
raise(sig);
signal(sig, myhandler);
}
SIG_IGN
具有值1
(也无效地址)。在这里,你可以返回(什么也不做)。
else if (previous_handler == SIG_IGN)
{
return;
}
否则(既不SIG_IGN
也不SIG_DFL
)你收到了一个有效的函数指针,你可以直接调用处理程序,
else
{
previous_handler(sig);
}
当然,你必须要考虑的不同的API(请参阅signal()
和sigaction()
的联机帮助页)。
[显式调用Linux上的SIG \ _DFL/SIG \ _IGN处理程序]的可能重复(http://stackoverflow.com/questions/3147840/explicitly-invoke-sig-dfl-sig-ign-handlers-on-linux ) – pilcrow 2014-12-21 04:31:35