如果一个应用程序执行fork()
并且subprocessabort()
(由于assert()
失败),父进程是否会收到一个SIGCHLD
?
如果它是相关的这是在Debian 4(gcc版本4.1.2)。
如果你想检查一样,写一个示例代码,分叉孩子和孩子呼叫中止()(提高sigabrt信号)。 检查strace上的输出(strace可执行文件)
对于下面的代码:
#include<stdio.h> #include<unistd.h> int main() { pid_t pid; if(pid=fork()<0) { fprintf(stderr,"Error in forking"); } else if(pid==0) { /*The child*/ abort(); } else { waitpid(pid,(int *)0,0); } return 0; }
我得到这个输出:
--- SIGCHLD (Child exited) @ 0 (0) --- gettid() = 4226 tgkill(4226, 4226, SIGABRT) = 0 --- SIGABRT (Aborted) @ 0 (0) --- +++ killed by SIGABRT +++
所以答案是肯定的,至少在Ubuntu发行版上。
除非孩子已经从父母(IIRC使用setsid()或setpgrp())分离出来,否则任何时候孩子终止都会期望父母得到一个SIGCHLD 。 小孩这样做的主要原因是孩子开始守护进程。 看到这里或这里是为了更深入地了解守护进程。