在父结束之前,linux永远不会结束子进程吗?

mad*_*adz 1 c linux fork

请在c中考虑此代码:

    int main()
    {
     pid_t cpid;
     cpid = fork();
     if (cpid == -1)
     {
            perror("fork");
            return 0;
     }
     if (cpid == 0)
     {
            printf("I'm child\n");
            _exit(0);
     }
     else
     {
            while(1)
            {
                    printf("I'm parent\n");
                    sleep(1);
            }
     }
     return 0;
    }
Run Code Online (Sandbox Code Playgroud)

在运行代码之后,我希望它能够运行child并在完成后退出它.但是当我跑步的时候

    pgrep executable_name
Run Code Online (Sandbox Code Playgroud)

要么

    ps fax
Run Code Online (Sandbox Code Playgroud)

它显示了子进程ID,我不知道它只是一个工作进程的历史废话,还是它真的没有结束/终止子进程?

提前致谢

Ada*_*ppe 5

孩子将一直待到父母去世或父母用wait系统调用清理它.(在孩子终止和被清理之间的时间里,它被称为僵尸过程.)

原因是父级可能对子级的返回值或最终输出感兴趣,因此进程条目保持活动状态,直到查询该信息为止.

编辑:

使用sigchld处理程序在没有阻塞的情况下立即清除进程的示例代码:

http://arsdnet.net/child.c

请注意,系统调用(如睡眠,选择或文件读/写)可能会被信号中断.这是你应该在unix中处理的正常事情 - 它们失败并将errno设置为EINTR.发生这种情况时,您可以再次尝试完成操作.这就是我的示例代码在父级中调用两次睡眠的原因 - 第一次长睡眠被孩子死亡打断,然后第二次更短的睡眠让我们确认在父亲死亡之前实际清理了该过程.

BTW信号处理程序通常不应该做太多,它们应该尽快返回并避免非线程安全的事情; 通常不鼓励打印它们.我这样做只是为了让你可以随时观看一切.

  • 为清楚起见:*仅*进程表条目在进程处于"僵尸"状态时存活; 所有其他资源都已取消分配. (2认同)