c - 在父进程结束之前,linux 是否永远不会结束子进程?

标签 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;
    }

运行代码后,我希望它运行 child 并在完成后退出。 但是当我运行时

    pgrep executable_name

    ps fax

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

提前致谢

最佳答案

子进程将一直存在,直到其父进程死亡或父进程使用 wait 系统调用将其清除。 (在子进程终止和被清理之间的时间里,它被称为僵尸进程。)

原因是父进程可能对子进程的返回值或最终输出感兴趣,因此在查询该信息之前进程条目保持事件状态。

编辑:

使用 sigchld 处理程序在进程死亡时立即清理进程而不会阻塞的示例代码:

http://arsdnet.net/child.c

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

顺便说一句,信号处理程序通常不应该做太多事情,它们应该尽快返回并避免非线程安全的事情;通常不鼓励在其中使用 printfing。我在这里做的只是为了让您可以看到发生的一切。

关于c - 在父进程结束之前,linux 是否永远不会结束子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025237/

相关文章:

c - 当我声明 static int 数组而不是使用 DEFINE 时使用 Variable ,对吗?

c - 在内核中高效分配内存

c - 为什么 fcntl() 不阻塞 WSL 中的 F_SETLKW?

c - 如何让 'fork()' ed child 共享标准输入?

c - 使用管道时出现段错误

c++ - 调用 "spin"是什么意思

c++ - Linux,需要精确的程序时序。调度唤醒程序

linux - 是否有适用于 Linux 的高性能 Fortran 编译器?

代码块不在 linux lite 中编译空 c 文件

r - 是否可以在 Windows 上获得 R 调查包的 `svyby` 函数 multicore= 参数?