2016-09-23 64 views
2

我在這裏看到了很多for循環中分叉的例子,但沒有太多說明它是如何做到的。讓我們以How to use Fork() to create only 2 child processes?的答案爲例,使用這個簡單的例子。在for循環澄清中分叉

for (i = 0; i < n; ++i) { 
    pid = fork(); 
    if (pid) { 
     continue; 
    } else if (pid == 0) { 
     break; 
    } else { 
     printf("fork error\n"); 
     exit(1); 
    } 
} 

大部分我見過的例子都遵循這種通用格式。但我不明白的是,這是如何防止子進程分叉?根據我的理解,每個創建的孩子都必須經歷這個循環。但fork()在for循環的最開始被調用,然後進行3次比較。有人可以解釋一下,即使孩子們似乎調用fork(),這個for循環仍然可以確保只有父類可以創建子元素嗎?

+3

首先'if'條件應該是'(pid> 0)' – ensc

+1

你不應該改變你不明白的東西。 'if/else if/else'與您鏈接的問題中的'if/else if/else'不同*。 – user3386109

回答

3

小孩從fork後面的行開始。 fork返回0爲孩子。在你的例子中,孩子將進入pid == 0區塊,break進入for循環。

fork一切都是完全相同的孩子和父母(包括下一個指令執行和變量值)。唯一的區別是來自分支的返回值(兒童的0和兒童的父母的pid)。

+0

哦,謝謝。我認爲孩子在節目的最初階段就開始了。 – Bob

+0

@Bob Nope。一切都完全相同(包括下一條執行指令和變量值​​)。唯一的區別是從'fork'返回。 – Riley

+0

因此,fork在調用時不會立即創建一個孩子? – Bob

0

經過檢查我的Why does this program print 「forked!」 4 times?。這對我來說似乎很簡單。

這是如何防止子進程分叉?

if (pid) { 
    continue; 
} 

你看當孩子被創建,然後對其執行代碼,並呼籲fork()它成爲在那個階段,從而pid將爲0

1

但我不明白的是,這是如何防止子進程分叉?

fork()在孩子中返回0。在你的示例代碼中,這會導致子項break退出循環,而不是執行另一次迭代,因此子項實際上不會調用fork()

2

fork返回時,它實際上返回兩次:一次給父母,一次給孩子。它將0返回給子級,並將子級的pid返回給父級。然後if塊檢測返回哪個進程。在父進程中,if (pid)的計算結果爲true,因此它會執行continue並跳轉到循環的頂部。

在子進程中,if (pid)的計算結果爲false,則if (pid == 0)的計算結果爲true,因此它會執行break跳出循環。所以孩子不會再分叉了。