子进程是否会在abort()上发送SIGCHLD?

时间:2010-10-01 09:16:37

标签: c linux fork assert sigchld

如果某个应用程序执行fork()并且该孩子死于abort()(由于assert()失败),父进程是否会收到SIGCHLD

如果相关,则在Debian 4(gcc 4.1.2版)上。

2 个答案:

答案 0 :(得分:4)

如果要检查相同内容,请编写一个示例代码,该代码会分叉子进程并且子进程调用abort()(以提高sigabrt信号)。检查它在strace上的输出。(strace executable)

以下代码:

 #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发行版上。

答案 1 :(得分:1)

除非孩子与父母分开(IIRC使用setsid()或setpgrp()),否则您希望父母在孩子终止时获得SIGCHLD。孩子这样做的主要原因是孩子是否正在开始一个守护进程。有关守护程序进程的深入处理,请参阅Here Here