繁体   English   中英

为什么这个叉子挂了?

[英]Why does this fork hang?

为什么程序没有结束? 打印完必须打印的内容后,孩子会挂起。 如果父进程睡觉而不是子进程睡觉,它会起作用,但为什么呢? 我也试过在每个进程结束时调用 exit ,但结果相同。 我总是要等孩子完成吗?

int main(){

    int pid = fork();

    char s[100] = "Hello";

    if(pid > 0){
        printf("FIRST PRINT IN PARENT: %s\n", s);
        strcat(s, " - PARENT");
        printf("SECOND PRINT IN PARENT: %s\n", s);
    }
    else if(pid == 0){
        printf("IMMEDIATELY IN CHILD: %s\n", s);
        sleep(2);
        printf("AFTER 2 SCONDS IN CHILD: %s\n", s);
    }
    return 0;
}

当父母退出时,它可能会向孩子发送一个信号( SIGHUP )。 如果是这样,如果孩子没有捕捉到那个信号,孩子就会死。

从历史上看,默认情况下,进程在退出时向其子进程发送SIGHUP 现在,许多 Linux 发行版默认不发送SIGHUP

我在 RHEL 上尝试了你的代码,但子进程没有被杀死。 所以父级死亡,控制权返回到 shell。 孩子继续并在 2 秒后打印它的第二个输出。

如果孩子确实收到了SIGHUP它不会挂起。 它死了,最后的字符串永远不会被打印出来。

在 Linux 中,您可以通过prctl系统调用打开SIGHUP

#include <sys/prctl.h>
prctl(PR_SET_PDEATHSIG, SIGHUP);

相关问题: how-to-make-child-process-die-after-parent-exits

一旦它的子进程(即代码中的父进程)退出,shell 就会给你提示。 但是,它不知道您的代码启动的子进程。

您观察到的问题的根源是您的父进程不等待其子进程。 使用wait(2)系统调用,比如wait(0); ,在父进程中。

不等待子进程的一般风险是您最终可能会遇到僵尸进程 相反,孤儿进程(如果您的父进程先退出)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM