首先,I do know that there was a similar question here in the past。
但这个问题没有得到妥善回答。相反,它转而建议如何捕捉信号。
所以只是为了澄清:我已经完成了处理信号所需要做的一切。 我有一个应用程序,它通过管道分配监视主进程的守护进程。 如果主进程崩溃(例如分段错误),它有一个信号处理程序,它将所有必需的信息写入管道并中止。
目标是尽可能多地获取信息当应用程序发生不良事件时,没有弄乱“正常”操作,例如SIGHUP,SIGUSR1等。
所以我的问题是:我应该抓住哪些信号? 我的意思是说,如果没有我捕获它们的信号会导致申请中止。
到目前为止,我已经提出以下列表:
kill <pid>
或AFAIK,可以是OutOfMemory的结果)有人知道我是否遗漏了什么? kill -l
有很多......:)
答案 0 :(得分:8)
我正在查看我的高级编程副本unix环境(Stevens)。根据有关信号的部分中的表格,如果您没有捕获它们,则以下POSIX信号将默认终止该过程。监控你不使用的所有这些并不是不合理的:
除了SIGKILL,你可以捕获所有这些,但希望SIGKILL不会经常为你出现。
请注意,您的信号手册页(man 7 signal
)应该为您提供适合您系统的列表 - 这是POSIX列表,可能因您的架构而异。
答案 1 :(得分:5)
您不应该捕获信号并将代码写入管道。这既不必要也不安全。
让我引用你所链接的问题的答案,指出为什么它不是故障安全的:“是什么让你觉得SEGV还没有破坏你的程序记忆”
现在你可能想知道如何做得更好,为什么我说这是“不必要的”。
可以使用waitpid
检查WIFSIGNALED()
系统调用的返回码,以确定进程是正常终止还是通过信号终止,WTERMSIG()
将返回信号编号。
这是故障安全和它不需要处理程序或管道。此外,您无需担心要捕获的内容,因为它会报告每个终止您的流程的信号。
答案 2 :(得分:1)
这取决于:无论你喜欢什么信号,如果有用的话告诉用户发生了一件坏事。但无法捕获SIGKILL和SIGSTOP。