每次調用到UNIX進程創建系統調用fork()的返回兩次。首先,它返回父進程的子進程(調用fork()的進程)。其次它返回到0新創建的孩子。
從手冊頁:
返回值
成功時,子進程的PID返回父,並在孩子則返回0。失敗時,在父項中返回-1,不創建子進程,並且適當地設置errno。
你的情況
if (fork() && !fork())
的語句中if
,叉調用兩次。所以會發生什麼是以下幾點:
A
|----------------B
| |
|---C |
| | |
現在先請fork()
將在A和B都返回一個將是非零和B中也將是零。
到叉二()調用將僅由A.因爲第一叉返回0至B,它不會喚起一個第二fork()
誘發。 其原因是&&
如果發現第一個操作數非零,則評估會短路。感謝Daniel指出了這一點。
因此,我們可以做一個表出來的這個:
PID fork()1 fork()2
------------------------------
A >0 >0
B =0 >0
C >0 =0
從圖表
因此,處理C的if
將進行評估,以TRUE
其重要要記住,沒有返回fork()1
到C.它得到副本已從其父母評估表達式。
我希望這能解釋你的問題。
如果您編輯您的問題,並格式化你到代碼段什麼樣的代碼這將是很好 – mathematician1975 2012-07-10 20:00:12
只有'fork'返回相同的值的兩倍......(有些情況下是很好的,但要注意,返回值是不同的在創建的2個過程中)。 – geoffspear 2012-07-10 20:00:28