2011-11-22 37 views
2

**僞代碼!C fork()和wait()調用如何工作?

fork(); 
printf(--print process ID); 
fork(); 
printf(--print process ID); 
fork(); 
printf(--print process ID); 

這......我假設今天有8個過程的結果(糾正我,如果我錯了)。

現在,如果等待電話被添加到此,會發生什麼?

fork(); 
wait(..); 
printf(--print process ID); 
fork(); 
wait(..); 
printf(--print process ID); 
fork(); 
wait(..); 
printf(--print process ID); 

我想,無論1)進程數將是相同的; 2)printf()打印也長得一模一樣?

回答

3

是的。等待調用會對進程的執行順序施加一些限制,但仍然會有8個進程。 printf語句看起來是一樣的,但它們可能會改變的順序。

這是可能的,但在所有的8個進程將在同一時間被執行,在等待該版本的第一個版本不能保證併發進程的數量將肯定不會達到8

在我的系統,等待()只會在直接的孩子完成時纔會返回,這樣您的等待版本將會以確定的方式打印出來:在父母繼續之前,孩子總是會完成的。

通常情況下,你會看到

N+1 //first printf 
N+2 //second printf 
N+3 //third printf 
N+2 //third printf 
N+1 //second printf 
N+4 //third printf 
N+1 //third printf 
N //first printf 
N+5 //second printf 
N+6 //third printf 
N+5 //third printf 
N //second printf 
N+7 //third printf 
N //third printf 

其中N是根進程的PID。獲得一個很好的連續PID數字塊取決於我在* nix系統上常見的pid分配方案,而不是在您的玩具程序運行時啓動某個其他進程。

我並不熟悉足夠多的操作系統來說100%,你永遠不會遇到等待()會收穫孫子們,但我會非常驚訝的聽到它。

+0

如果沒有等待,第一個版本會出現相同的打印輸出嗎? –

+0

@JimAvery:你不能確定。這取決於如何在流程中完成調度。父母和孩子執行的順序不能在第一個中確定,因此不能確定「printf」語句的順序。但是,在第二種情況下,確保父母將等待'wait()'調用孩子完成。 –