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

时间:2013-01-25 18:40:18

标签: c linux event-handling signals

我用:

signal(SIGINT, CtrlHandler);

添加SIGINT事件的处理程序。但是我怎么能删除这个处理程序呢?

1 个答案:

答案 0 :(得分:16)

以下是您的工作:

signal(SIGINT, SIG_DFL);

将信号处理程序重置为该信号的默认行为(如果尚未设置,则包括默认处置)。在SIGINT的情况下,它会在没有核心转储的情况下中止您的进程。

The manual for signal解释了为什么会这样做:

  

signal(signum, handler)将信号signum的处置设置为handler,即SIG_IGNSIG_DFL或程序员定义的函数的地址(“信号处理程序”)。 ...如果处置设置为SIG_DFL,则会发生与信号关联的默认操作。

您还可以使用man命令查找此信息。如果在命令行中键入man signal并通读,则应该看到它。

这非常特定于您已替换系统默认信号处理程序的情况。在某些情况下,你想要的只是简单地恢复那里的任何处理程序。如果你看一下signal的定义,它看起来像这样:

sighandler_t signal(int signum, sighandler_t handler);

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