2016-09-19 61 views
0

昨天,我接受了一次採訪,並被問及使用fork()的代碼片段的這個問題。有多少個進程?

void main() 
{............ 
for (int k=1;k<=10;k++) 
{ 
pid[k]=fork(); 
if(!pid[k]) 
execvp(.....); 
} 
} 

根據我的瞭解,我對總共1024個過程將在那裏包括父爲2^N -1 = 1023 + 1父,其中n =總叉

不過,面試官回答說,我的答案是錯的。

我的理解有什麼問題?

+0

這個程序是由execvp執行的這個程序,還是相關的東西?這也可能有助於知道爲什麼你認爲1024是正確答案(即解釋你的推理) – fvu

+0

我認爲孩子被不同的程序取代。 – Garrick

+0

那麼,在這種情況下,子進程將不會參與進一步的分叉,這將導致10個孩子和1個父母,否?另外,2^10-1絕對不是1024 ... – fvu

回答

1

鑑於此代碼

pid[k]=fork(); 
if(!pid[k]) 
    execvp(.....); 

和閱讀the man page of fork其中指出

成功時,子進程的PID在父返回, 和0的孩子返回。

我們知道子進程將執行exec調用(並繼續執行不同的程序),而父進程將循環並創建另一個子進程。

這意味着將爲循環的每次迭代創建一個孩子,在這種情況下將會創建一個孩子10次。所以,答案是10個孩子+ 1個父= 11


現在,如果得到通過EXEC啓動的程序是一樣的節目,樂趣只會在計算機的內存耗盡時停止:在每次迭代10個項目每個將創建10個孩子,每個孩子將創建10個孩子,等等。 fork()的一個特性是父母和孩子獲得了相同變量的圖像(這會導致可預測的孩子數量,即某個與2的冪相關的數字),顯然,當程序獲得時,這是不正確的exec'd,這意味着可用內存將是唯一的限制。

+0

如果execvp()加載相同的程序,那麼? – Garrick