任何人都可以請解釋這個C代碼是如何工作的嗎?完成後會產生多少個進程?LINUX叉環功能
int main(void)
{
int i;
for(i=1; i<=42; i++)
{
fork();
}
return 0;
}
任何人都可以請解釋這個C代碼是如何工作的嗎?完成後會產生多少個進程?LINUX叉環功能
int main(void)
{
int i;
for(i=1; i<=42; i++)
{
fork();
}
return 0;
}
在for
循環的每次迭代,fork
被調用一次。對於每個呼叫fork
,都會創建一個新流程;最終產生多少個進程取決於循環的長度。
如果循環長度爲1,則只會創建一個新進程,總共需要2個進程。
如果循環長度爲2,則在第一次迭代時將創建一個新進程;每個過程會在下一次迭代中產生另一個過程,總共需要3次調用fork
和4個總過程。
正如你所想的那樣,在每次迭代中,進程的數量加倍;如果n
是循環的長度,則說明進程總數爲f(n) = 2^n
(生成2^n - 1
進程)。讓我們通過歸納證明它是真實的。我們已經看到該公式適用於n=1
和n=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
新工藝。
感謝您的幫助。 – 2014-09-06 16:08:53
使用此方案得到了答案:
#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
子進程在產生時也會調用fork語句。因爲我們知道子進程獲取父進程的完整副本。因此,在獲取父進程的副本時,子進程將獲得fork語句。子進程調用這個fork語句嗎? – 2014-08-30 14:38:47
是的,子進程也會調用fork語句。 – user1336087 2014-08-30 14:46:20
不應該是2^42,你寫的一半? – Odexios 2014-08-30 15:43:40
多少你覺得獲得創建? – 2014-08-30 11:19:45