昨天,我接受了一次採訪,並被問及使用fork()的代碼片段的這個問題。有多少個進程?
void main()
{............
for (int k=1;k<=10;k++)
{
pid[k]=fork();
if(!pid[k])
execvp(.....);
}
}
根據我的瞭解,我對總共1024個過程將在那裏包括父爲2^N -1 = 1023 + 1父,其中n =總叉
不過,面試官回答說,我的答案是錯的。
我的理解有什麼問題?
昨天,我接受了一次採訪,並被問及使用fork()的代碼片段的這個問題。有多少個進程?
void main()
{............
for (int k=1;k<=10;k++)
{
pid[k]=fork();
if(!pid[k])
execvp(.....);
}
}
根據我的瞭解,我對總共1024個過程將在那裏包括父爲2^N -1 = 1023 + 1父,其中n =總叉
不過,面試官回答說,我的答案是錯的。
我的理解有什麼問題?
鑑於此代碼
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,這意味着可用內存將是唯一的限制。
如果execvp()加載相同的程序,那麼? – Garrick
這個程序是由execvp執行的這個程序,還是相關的東西?這也可能有助於知道爲什麼你認爲1024是正確答案(即解釋你的推理) – fvu
我認爲孩子被不同的程序取代。 – Garrick
那麼,在這種情況下,子進程將不會參與進一步的分叉,這將導致10個孩子和1個父母,否?另外,2^10-1絕對不是1024 ... – fvu