哪个"致命"信号应该是用户级程序捕获?

时间:2012-11-04 13:46:13

标签: c linux signals posix

首先,I do know that there was a similar question here in the past

但这个问题没有得到妥善回答。相反,它转而建议如何捕捉信号。

所以只是为了澄清:我已经完成了处理信号所需要做的一切。 我有一个应用程序,它通过管道分配监视主进程的守护进程。 如果主进程崩溃(例如分段错误),它有一个信号处理程序,它将所有必需的信息写入管道并中止。

目标是尽可能多地获取信息当应用程序发生不良事件时,没有弄乱“正常”操作,例如SIGHUP,SIGUSR1等。

所以我的问题是:我应该抓住哪些信号? 我的意思是说,如果没有我捕获它们的信号会导致申请中止。

到目前为止,我已经提出以下列表:

  • SIGINT(^ C,用户启动,但仍然很有用)
  • SIGTERM(shell中的kill <pid>或AFAIK,可以是OutOfMemory的结果)
  • SIGSEGV
  • SIGILL
  • SIGFPE
  • SIGBUS
  • SIGQUIT

有人知道我是否遗漏了什么? kill -l有很多......:)

3 个答案:

答案 0 :(得分:8)

我正在查看我的高级编程副本unix环境(Stevens)。根据有关信号的部分中的表格,如果您没有捕获它们,则以下POSIX信号将默认终止该过程。监控你不使用的所有这些并不是不合理的:

  • SIGABRT
  • SIGALRM
  • SIGFPE
  • SIGHUP
  • SIGILL
  • SIGINT
  • SIGKILL
  • SIGPIPE
  • SIGQUIT
  • SIGSEGV
  • SIGTERM
  • SIGUSR1
  • SIGUSR2

除了SIGKILL,你可以捕获所有这些,但希望SIGKILL不会经常为你出现。

请注意,您的信号手册页(man 7 signal)应该为您提供适合您系统的列表 - 这是POSIX列表,可能因您的架构而异。

答案 1 :(得分:5)

您不应该捕获信号并将代码写入管道。这既不必要也不安全。

让我引用你所链接的问题的答案,指出为什么它不是故障安全的:“是什么让你觉得SEGV还没有破坏你的程序记忆”

现在你可能想知道如何做得更好,为什么我说这是“不必要的”。

可以使用waitpid检查WIFSIGNALED()系统调用的返回码,以确定进程是正常终止还是通过信号终止,WTERMSIG()将返回信号编号。

这是故障安全它不需要处理程序或管道。此外,您无需担心要捕获的内容,因为它会报告每个终止您的流程的信号。

答案 2 :(得分:1)

这取决于:无论你喜欢什么信号,如果有用的话告诉用户发生了一件坏事。但无法捕获SIGKILL和SIGSTOP。