[英]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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.