2012-02-15 59 views
8

這是最近GATE入學考試的一個問題。
的方法執行的代碼C程序中的fork()

fork(); 
fork(); 
fork(); 

創建進程的總數是

(A)3(B)4(C)7(d)8。

我的回答是(A)3.

我的看法是,在每個fork()之後,將創建一個子進程並且父進程的執行將正常繼續。從教練的機構

不可靠的答案(沒有任何解釋)爲(C)7.

我覺得他們處理每一個叉將創建一個子進程和新的父進程。而且他們也計算了所有的父母程序。 [我不允許發佈圖片,但我的朋友在圖表中解釋了一個樹,每個左邊的節點在兩個節點中分叉。因此左邊的4個父節點和右邊的3個子節點。] 但問題清楚地提到了子進程。而且我不認爲這個父進程是新創建的。

有人可以解釋一些分叉基本原理,並請妥善解決上述問題。

P.S.如果編程語言在分岔概念上有所不同,那麼按照教學大綱,這應該是C或C++程序。

+3

第一進程可創建子進程的去'fork()的'自己。你也應該數這些。 – 2012-02-15 19:13:24

+1

不,分叉是一個操作系統的概念 - 編程語言無關緊要。 – Rup 2012-02-15 19:17:09

+2

這說明了爲什麼多項選擇題在辯解中表現出理解。如果你必須寫一個答案來解釋你是如何得到答案的,那麼即使你從「官方答案」中得出了不同的結論,你也可以得到理解這些概念的功勞。例如,兒童進程的孩子是否被計算在內?它改變了要給出的答案。 – 2012-02-15 19:23:06

回答

26

fork()導致原始過程和一個孩子從代碼的那一點開始。因此,您看到這樣的畫面:

enter image description here

+2

在圖表上幹得不錯。 – 2012-02-15 23:14:01

+0

@JonathanLeffler赫赫謝謝,並且你的回答很好,畢竟它更詳細! – 2012-02-16 06:58:43

+1

@eznme「從代碼中的那一點開始」這是否意味着在第二個分支之後,子代和父代都將繼續從第三個fork()語句的下一行執行? – 2012-02-16 19:22:35

15

我認爲總共有8個過程,或者原始的7個後代,或者原始的3個直接子女(其他人是大孩子和曾祖父孩子)。

  • 在第一個fork()之後,假設沒有故障(始終),有兩個過程。
  • 每個人都會再次執行fork()--所以現在有四個進程。
  • 每個人都會再次執行fork()--所以現在有8個進程。
+0

iit的正式答案關鍵字在幾天前出來。正確的答案是7.不幸的是,他們沒有提供完整的解決方案,只是答案。 – 2012-03-22 19:36:42

3

每次調用fork之後,都有兩個進程,父進程和子進程。這些進程的這兩個在fork後立即繼續執行。一些產生的過程是(在所有的分叉之後)父母和孩子。那些只有的孩子是葉子的進程樹。其中一個(原來的那個)即只有父母是這棵樹。父母和子女都是分支機構

+0

所以在上圖中,子節點是底部的8個葉子,根節點是父節點。答案應該是8. – 2012-02-16 19:50:12

+2

@AbhinavKulshreshtha:在上圖中,最左邊的垂直線是原始過程,並且* *不是*由示例中的任何'fork()'創建的子項。它*是一個其他進程的孩子,但我不會將它計算爲由fork()創建的。叉子(); fork()' – 2012-02-16 21:34:27

+0

官方答案是7.他們沒有提供完整的解決方案,但在這個頁面上,你的解釋和@eznme圖是最簡單的。謝謝 – 2012-03-22 19:41:04

4

試試這個:

printf("initial pid: %d\n", (int)getpid()); 
fork(); 
fork(); 
fork(); 
printf("final pid: %d\n", (int)getpid()); 
+0

我的鏈接器錯誤_getpid和_fork。 這是我用 '的#include 的#include 無效的主要() {printf的 代碼( 「初始PID:%d \ n」 個,(INT)GETPID()); fork(); fork(); fork(); getch(); }' – 2012-02-16 19:43:59

+0

我使用的是Windows 7下的dosbox模擬下的turbo C++ 3.1 – 2012-02-16 19:47:37

+2

DOS和Windows都沒有'fork()'。您無法在這些操作系統中嘗試該片段。我不知道如何在DOS中做同樣的事情;你可以在Windows中嘗試[CreateProcess()](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v%3Dvs.85%29.aspx)(它不完全像'叉()')。 – pmg 2012-02-16 19:55:37