任何人都可以请解释这个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