使用sigaction为SIGCHLD知道孩子何时终止但无法告知孩子SIGSEV何时

时间:2011-04-20 14:58:35

标签: c linux signals

根据sigaction的手册页,如果我们将它与SIGCHLD一起使用,那么在我们的处理函数中 - 如果我们使用void (*sa_sigaction)(int, siginfo_t *, void *);

si_code结构的siginfo_t成员应包含发送信号的原因。

我对这些原因很感兴趣......

CLD_EXITED
CLD_KILLED
CLD_DUMPED

现在我的问题是......即使孩子异常退出(即通过执行错误的代码) 导致崩溃)我仍然得到CLD_EXITED。我以为我应该得到CLD_DUMPED。 至于CLD_KILLED,如果我杀了一个子进程,我会正确地得到这个。

我错过了什么?在我的父进程中,我需要知道是否有任何子进程突然终止。

我通过尝试写入空指针导致突然错误,但我需要知道任何类型的异常终止。没有必要确切地知道它发生了什么或如何发生。

CLD_DUMPED生成的时间是什么时候?

亲切的问候。

2 个答案:

答案 0 :(得分:1)

而不是给予信号处理程序的si_code,您应该只是查看waitpid(或其他wait - 系列函数之一)的退出状态,以确定退出的原因。来自W*的宏sys/wait.h在应用于状态int时会告诉您终止的原因。

答案 1 :(得分:0)

AFAIK,CLD_DUMPED是在进程转储核心时引起的。