13

我用:

signal(SIGINT, CtrlHandler);

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

4

1 回答 1

23

这是你要做的:

signal(SIGINT, SIG_DFL);

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

手册signal解释了为什么这样做:

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

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

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

sighandler_t signal(int signum, sighandler_t handler);

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

于 2013-01-25T19:19:00.503 回答