我有几个信号处理程序,我正在使用它们来干净地退出我的程序,并且我想通过链接信号处理程序调用来很好地处理任何其他 Hook 它们的东西。我在手册页中使用 sigaction 来表示它不再是首选。
查看 sigaction 结构,其中指定了信号掩码等,以及几个标志。调用当前安装的处理程序以便将所有这些选项都考虑在内的“正确”方法是什么?
最佳答案
答案是“这取决于”:信号处理程序做什么:
- 许多人的第一 react 是信号处理程序将用于处理
SIGINT
等,并彻底终止程序。 - 另一方面,存在(或多或少)良性信号,例如
SIGWINCH
(您希望不停止您的程序)。
在“干净地终止一个程序”中,可能没有空间让其他程序做一些有用的事情。例如,建议的链式处理程序可能会关闭您依赖的文件。因此,您必须首先充分了解其他处理程序的作用。
如果信号处理程序在后一类中,只需更新应用程序可以测试的变量,那么信号处理程序函数 只是另一个函数。当您调用 signal
将信号与函数相关联时,它会返回前一个处理程序(可能是神奇值之一,例如。SIG_DFL
、SIG_IGN
)。如果你保存它,就可以检查它是否不是那些,并且(大概)是一个真正的功能。调用那个函数会继续执行,就好像它是您当前信号处理程序的一部分一样。
这不是一个新想法(我在 1990 年代后期使用过它),并且偶尔会被讨论:
- signal() overwriting other signal handlers
- sigaction - how to find and invoke previous signal handler (sa_handler)
- Use reentrant functions for safer signal handling
当然还有:
关于linux - 在 Linux 中链接信号处理程序的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36044772/