我有一些信号处理程序,我用它来干净地退出我的程序,而且我想通过链接信号处理程序调用来很好地处理其他任何挂钩的程序。我在手册页上使用了sigaction来表示它不再是首选的信号。
查看sigaction结构,有指定的信号掩码和几个标志。什么是"对"调用当前安装的处理程序以便考虑所有这些选项的方法吗?
答案 0 :(得分:2)
答案是"它取决于":信号处理程序做什么:
SIGINT
等,并彻底终止程序。SIGWINCH
(您希望不停止您的程序)。在"彻底终止程序",其他程序可能没有 room 来做一些有用的事情。例如,建议的链式处理程序可能会关闭您依赖的文件。所以你必须先了解其他处理程序的工作。
如果信号处理程序在后一类中,只需更新应用程序可以测试的变量,那么信号处理程序 function 就是另一个函数。当您调用signal
将信号与函数关联时,会返回前一个处理程序(可能是其中一个神奇的值,例如。SIG_DFL
,SIG_IGN
)。如果你保存它,可以检查它是否是那些,并且(可能)是一个真正的功能。调用 函数将继续执行,就像它是当前信号处理程序的一部分一样。
这不是一个新想法(我在20世纪90年代末使用过它),偶尔会讨论:
当然:
答案 1 :(得分:0)
嗯,正确答案IMO是“不要那样做”。我想如果你打算连接信号处理程序,你应该重新考虑。
基本上,如果你有一些非常重要的东西,即使有致命信号到达也必须清理它,那么你应该快速完成那部分并重置信号处理程序,然后再运行任何其他代码。
SIGTERM和SIGQUIT等信号应由以正常方式终止程序的事件处理。通常,您的信号处理程序在管道上写入以向应用程序中的正常事件循环发送消息,或者如果您没有事件循环则设置全局变量。
也许您知道这一点,但请务必阅读可从信号处理程序安全调用的函数列表。它应该在手册页中。除了那个清单之外的任何东西都不安全。