根据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
生成的时间是什么时候?
亲切的问候。
答案 0 :(得分:1)
而不是给予信号处理程序的si_code
,您应该只是查看waitpid
(或其他wait
- 系列函数之一)的退出状态,以确定退出的原因。来自W*
的宏sys/wait.h
在应用于状态int
时会告诉您终止的原因。
答案 1 :(得分:0)
AFAIK,CLD_DUMPED
是在进程转储核心时引起的。