在C语言中删除Linux信号处理程序

16

我使用:

signal(SIGINT, CtrlHandler);

如何添加 SIGINT 事件的处理程序?但是我该如何删除这个处理程序呢?

1个回答

25

这是你要做的:

signal(SIGINT, SIG_DFL);

那会将信号处理程序重置为该信号的默认行为(包括默认处置方式,如果未设置的话)。对于SIGINT,它将在不生成核心转储的情况下中止进程。signal的手册解释了为什么会这样:signal(signum, handler)将信号signum的处置设置为handler,可以是SIG_IGN、SIG_DFL或者程序员定义的函数(“信号处理程序”)的地址......如果处置被设置为SIG_DFL,则发生与信号相关联的默认操作。您也可以使用man命令找到这些信息。如果在命令行上键入man signal并阅读,您应该能看到它。
这与您替换系统默认信号处理程序的情况非常相关。在某些情况下,您想要的只是恢复最初存在的任何处理程序。如果您查看signal的定义,它看起来像这样:
sighandler_t signal(int signum, sighandler_t handler);

所以,它返回一个 sighandler_t。返回的 sighandler_t 表示信号的先前“处理方式”。因此,另一种处理方式是简单地保存它返回的值,然后在想要删除自己的处理程序时恢复该值。

@jameshfisher - 感谢您的编辑。有时我会对那些不看手册的人感到沮丧。 :-) - Omnifarious
1
如果一个应用程序安装了自己的信号处理程序,然后一个库暂时安装了一个信号处理程序,该怎么办?在这种情况下,该库需要恢复先前的处理程序,而不是默认的处理程序。 - jww
@jww - 我解决了这个问题。这是你想要的吗? - Omnifarious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接