【问题标题】:Will a child process send SIGCHLD on abort()?子进程会在 abort() 上发送 SIGCHLD 吗?
【发布时间】:2010-10-01 09:16:37
【问题描述】:

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

如果相关,这是在 Debian 4(gcc 版本 4.1.2)上。

【问题讨论】:

    标签: c linux fork assert sigchld


    【解决方案1】:

    如果您想检查相同的内容,请编写一个示例代码,该代码派生一个孩子并且孩子调用 abort() (以提高 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 发行版上是这样。

    【讨论】:

      【解决方案2】:

      除非孩子已经将自己与父母分开(IIRC 使用 setsid() 或 setpgrp()),否则您会希望父母在孩子终止时得到SIGCHLD。孩子这样做的主要原因是孩子是否正在启动一个守护进程。请参阅 Here Here 以更深入地处理守护进程。

      【讨论】:

      • 当你分开时你仍然会得到一个SIGCHLD,只是它发生在孩子分开的时候,然后被分开的孩子有 PID 1 作为它的父母,所以当这个进程死亡时,SIGCHLD 被发送处理 1(或多或少是内核)
      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 2011-04-13
      • 2013-07-20
      相关资源
      最近更新 更多