GNU C 库参考手册有一整章解释了有关信号处理的所有内容。
当您安装自己的处理程序时,您总是会获得先前设置的信号处理程序(一个函数指针)(请参阅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()
)。