9

首先,我确实知道过去这里有一个类似的问题

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

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

目标是在应用程序发生不良情况时获得尽可能多的信息,而不会干扰“正常”操作,例如 SIGHUP、SIGUSR1 等。

所以我的问题是:我应该捕捉哪些信号? 我的意思是如果我没有捕捉到它们的信号,无论如何都会导致应用程序中止。

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

  • SIGINT(^C,用户启动,但仍需了解)
  • SIGTERM(kill <pid>来自 shell 或 AFAIK,可能是 OutOfMemory 的结果)
  • SIGSEGV
  • 西吉尔
  • SIGFPE
  • 信号总线
  • SIGQUIT

有人知道我是否想念什么吗?kill -l有很多... :)

4

3 回答 3

9

我正在查看我的 unix 环境高级编程副本 (Stevens)。根据信号部分中的表格,如果您没有捕捉到以下 POSIX 信号,则默认情况下会终止进程。监视所有您不使用的所有这些并不是不合理的:

  • SIGABRT
  • SIGALRM
  • SIGFPE
  • SIGHUP
  • 西吉尔
  • 信号情报
  • 杀戮
  • SIGPIPE
  • SIGQUIT
  • SIGSEGV
  • SIGTERM
  • SIGUSR1
  • SIGUSR2

您可以捕获除 SIGKILL 之外的所有这些,但希望 SIGKILL 不会经常出现。

请注意,您的信号手册页man 7 signal

于 2012-11-04T14:06:37.103 回答
5

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

让我从您链接的问题中引用一个答案,以指出为什么它不是故障安全的:“是什么让您认为 SEGV 尚未损坏您的程序内存”

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

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

这是故障安全的它不需要处理程序或管道。另外,您不必担心要捕获什么,因为它会报告终止您的进程的每个信号。

于 2012-11-04T13:59:23.423 回答
1

这取决于:您喜欢的任何信号是否有助于通知用户刚刚发生了不好的事情。但是 SIGKILL 和 SIGSTOP 不能被捕获。

于 2012-11-04T13:49:49.277 回答