【发布时间】:2011-04-08 09:26:25
【问题描述】:
我使用signal(SIGINT,my_handler) 将SIGINT 指向my_handler。一段时间后,我想将它重置为它通常指向的任何默认处理程序。我该怎么做?
【问题讨论】:
-
考虑移植您的代码以使用
sigaction(),其中允许保存旧的信号处理配置并在以后正确恢复它。
我使用signal(SIGINT,my_handler) 将SIGINT 指向my_handler。一段时间后,我想将它重置为它通常指向的任何默认处理程序。我该怎么做?
【问题讨论】:
sigaction(),其中允许保存旧的信号处理配置并在以后正确恢复它。
今天推荐使用sigaction。
此外,它允许您在第一次调用自定义处理程序之前自动将信号处理程序重置为默认值。
SA_RESETHAND如果设置,信号的处置应重置为
SIG_DFL,并且SA_SIGINFO标志应在进入信号处理程序时被清除。注意:
SIGILL和SIGTRAP发货时不能自动复位;系统 默默地执行这个限制。否则,信号的配置不应在进入 信号处理程序。
此外,如果设置了此标志,
sigaction()的行为可能与SA_NODEFER标志也被设置了。
#include <signal.h>
#include <stdio.h>
action.sa_handler = my_handler;
action.sa_flags = SA_RESETHAND;
if (sigaction(SIGINT, &action, NULL) == -1)
{
perror("Failed to install signal handler for SIGINT");
}
如果信号处理程序不是使用 sigaction 的一次性处理程序,请参阅这篇文章,了解如何将信号处理程序重置为默认值: https://stackoverflow.com/a/24804019/7044965
【讨论】:
将SIG_DFL 作为func 参数传递给signal() 以重置默认行为:
signal(SIGINT, SIG_DFL);
【讨论】: