2017-08-14 181 views
0
if (fork() == 0) { 
    printf("[Child] I'm exiting\n"); 
} 

else { 
    wait(NULL); 
    printf("[Parent] child exited\n"); 

} 

wait(NULL)等待任何孩子來完成,然後它會之後執行的一切。所以在這種情況下,程序的輸出是什麼?什麼是等待(null)在這種情況下做什麼,程序的輸出是什麼?

我們可能先進入父母,然後我們將不得不等待孩子完成,因此它的[Child] ..... , [Parent] ....打印。

我們還可以進入子,其打印東西,然後父母,在這種情況下wait(NULL)會永遠等待,因爲child process已經completle。所以在這種情況下,輸出是只是[Child].....

我跑1000倍,但它看起來像它的輸出始終孩子 ...父

感謝

+0

'任何孩子等待complete' ::是這樣,*塊*直到wait()的回報。如果它返回,您**知道孩子已經終止。 – wildplasser

回答

1

如果孩子還沒有退出,父將等待,直到它退出。

如果孩子已經退出,父母將獲得其狀態信息,然後繼續執行。在這種情況下,函數wait()將立即返回。 See this

所以這個程序將始終打印:

[Child] I'm exiting 
[Parent] child exited 
1

看起來你實際上是在問墊層問題是如何fork作品。

當你做fork()時,操作系統會複製調用進程(父進程)。它會創建一個孩子,這是父母的完全副本(減去some details)。 fork()函數的返回值是子進程中的0和父進程中的子進程的PID。

所以,在您的fork之後,子進程將執行if子句下的代碼,父進程將執行else子句。請記住,您現在有兩個並行執行的進程。但是,父進程會因爲wait(NULL)而被阻止,直到孩子退出。當孩子(打印消息)並退出時,父母繼續執行wait後的代碼,打印其消息並退出。

這就是爲什麼你會總是見:

[Child] I'm exiting 
[Parent] child exited 
相關問題