簡體   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