理解它的關鍵很簡單:fork()
,如果成功,返回兩次:在父項和子項中。在父母中,它返回新生兒的PID;在孩子中它返回0;
10 3 4
永遠不會發生:如果打印3
,這意味着一個子進程已成功創建(因爲fork()
對孩子返回0),所以有將打印4
兩個過程。假設fork()
成功,在輸出中只有一個4是不可能的。
下面是一組可能的輸出:
10 2 4 3 4
:發生這種情況如果父母都執行先其次是孩子。父母打印10 2 4
,然後小孩打印3 4
。
10 2 3 4 4
:發生在母先執行,打印2
,那麼孩子執行並打印3
,然後無論是父母還是孩子打印4
,然後其他打印4
10 3 4 2 4
:發生在孩子執行時首先,打印3
和4
,然後父母繼續並打印2
和4
。
10 3 2 4 4
:當孩子先執行,打印3
,然後父恢復並打印2
,然後無論是父母還是孩子打印4
,然後其他印刷品的最終4
發生。
10 2 4
:發生在fork()
失敗並返回-1
,在這種情況下,沒有任何兒童被創造的,因此你的原始過程的輸出僅
如果你在一個行緩衝終端運行程序,這些都是可能的。但是,如果將輸出重定向到文件,您可能會有一個驚喜,並在輸出中看到10
多次。
發生這種情況是因爲重定向到文件通常會將緩衝模式從行緩衝切換到完全緩衝。假設緩衝區大小大於字符串10\n
的3個字符,並且緩衝區在此期間未被刷新 - 也是一個合理的假設 - 子進程將以包含10\n
的輸出緩衝區開始。所以,你最終在輸出中有兩個10\n
。
因此,該組可能的輸出在此可以被擴展爲包括另一10
在子打印3
前每一種可能性:
10 2 4 10 3 4
10 2 10 3 4 4
10 10 3 4 2 4
10 10 3 2 4 4
'fork()'通過複製其父項來創建子進程。在發佈之前,您應該在線閱讀有關'fork()'的調用。 http://linux.die.net/man/2/fork – jndok
另外,請在發佈之前嘗試運行您的代碼。輸出永遠不會是'10 3 4'。 – user3386109