我用:
signal(SIGINT, CtrlHandler);
添加SIGINT
事件的处理程序。但是我怎么能删除这个处理程序呢?
答案 0 :(得分:16)
以下是您的工作:
signal(SIGINT, SIG_DFL);
将信号处理程序重置为该信号的默认行为(如果尚未设置,则包括默认处置)。在SIGINT的情况下,它会在没有核心转储的情况下中止您的进程。
The manual for 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
表示信号的先前“处置”。因此,处理此问题的另一种方法是简单地保存它返回的值,然后在想要删除自己的处理程序时恢复该值。