2011-10-08 31 views
3
main() { 
    fork(); 
    fork(); 
    printf("Hello world\n"); 
} 

在上述程序中,父進程生成子進程。孩子的過程反過來產生一個孫子過程。執行這個程序後,我得到以下輸出。unix中的多個叉子

Macintosh:unix NightFury$ ./a.out 
Hello world 
Hello world 
Hello world 
Macintosh:unix NightFury$ Hello world 

爲什麼不輸出來作爲一個單一的過程輸出?是的,應該打印4個「你好世界」,但爲什麼最後一個作爲單獨的過程打印?

+0

嘗試'./a.out> result.txt'並檢查文本文件的內容。 –

回答

4

shell等待第一個進程結束,然後再次打印shell提示符。您還有三個其他進程在運行,當時有兩個進程在shell提示符出現之前寫入了輸出,一個在後面寫入了它的輸出。每次運行程序時,事情可能不會按照這個確切的順序發生 - 有時候您可能會比這個例子晚或晚得到shell提示符。

這是你可以寫一個不斷在「後臺」運行程序。

1

他們實際上都印爲一體,但父進程死亡,因此外殼打印出的「Macintosh:UNIX NightFury $」線與最後剩餘的子進程後打印其行。 實際上,您應該可以通過添加一行來請求父進程等待每個孩子死亡的行,然後不應該有該行。