2014-08-30 97 views
-2

任何人都可以請解釋這個C代碼是如何工作的嗎?完成後會產生多少個進程?LINUX叉環功能

int main(void) 
{ 
    int i; 
    for(i=1; i<=42; i++) 
    { 
     fork(); 
    } 
    return 0; 
} 
+3

多少你覺得獲得創建? – 2014-08-30 11:19:45

回答

2

for循環的每次迭代,fork被調用一次。對於每個呼叫fork,都會創建一個新流程;最終產生多少個進程取決於循環的長度。

如果循環長度爲1,則只會創建一個新進程,總共需要2個進程。

如果循環長度爲2,則在第一次迭代時將創建一個新進程;每個過程會在下一次迭代中產生另一個過程,總共需要3次調用fork和4個總過程。

正如你所想的那樣,在每次迭代中,進程的數量加倍;如果n是循環的長度,則說明進程總數爲f(n) = 2^n(生成2^n - 1進程)。讓我們通過歸納證明它是真實的。我們已經看到該公式適用於n=1n=2。假設它對n有效,並且對於n+1進行驗證。

如果lenght是n+1,在第一次迭代中一個新的進程產生,總共2個處理每個靜止具有n迭代做,這意味着(通過感應假設)每個進程將產生2^n - 1工藝,其中意味着總共2^(n+1) - 2個進程將在最近的迭代中產生;我們已經有2個進程,這意味着創建的進程總數(計數主進程)將爲2^(n+1) - 2 + 2 = 2^(n+1)

總之,對於lenght n的循環中,我們有2^n - 1呼叫fork,這意味着在你的情況下,我們必須由主之一,其後代產生了2^42 - 1新工藝。

+0

感謝您的幫助。 – 2014-09-06 16:08:53

1

使用此方案得到了答案:

#include<stdio.h> 
#include<math.h> 

int main() 
{ 
    float sum=0; 
    int i; 
    for(i=1;i<=42;i++) 
    { 
     sum = sum + pow(2,i); 
     printf("fork call:%d, processes:%1.f\n",i,sum); 
    } 
    return 0; 
} 
//When fork call is 42 the processes will be 8796093022208 
+0

子進程在產生時也會調用fork語句。因爲我們知道子進程獲取父進程的完整副本。因此,在獲取父進程的副本時,子進程將獲得fork語句。子進程調用這個fork語句嗎? – 2014-08-30 14:38:47

+0

是的,子進程也會調用fork語句。 – user1336087 2014-08-30 14:46:20

+0

不應該是2^42,你寫的一半? – Odexios 2014-08-30 15:43:40