一个subprocess会在abort()上发送SIGCHLD吗?

如果一个应用程序执行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 。 小孩这样做的主要原因是孩子开始守护进程。 看到这里或这里是为了更深入地了解守护进程。