2014-08-30 93 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