Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 循环中的Linux Fork功能_C_Linux_Unix - Fatal编程技术网

C 循环中的Linux Fork功能

C 循环中的Linux Fork功能,c,linux,unix,C,Linux,Unix,有人能解释一下这个C代码是如何工作的吗?完成后将生成多少个进程 int main(void) { int i; for(i=1; i<=42; i++) { fork(); } return 0; } int main(无效) { int i; 对于(i=1;i在for循环的每次迭代中,fork只被调用一次。对于fork的每次调用,都会创建一个新进程;最后生成多少进程取决于循环的长度 如果循环的长度为1,则只会创建一个新进程,

有人能解释一下这个C代码是如何工作的吗?完成后将生成多少个进程

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

对于(i=1;i在
for
循环的每次迭代中,
fork
只被调用一次。对于
fork
的每次调用,都会创建一个新进程;最后生成多少进程取决于循环的长度

如果循环的长度为1,则只会创建一个新进程,总共有2个进程

如果循环的长度为2,则在第一次迭代时将创建一个新进程;然后每个进程将在下一次迭代时生成另一个进程,总共调用3个
fork
,总共调用4个进程

正如您可能假设的那样,在每次迭代中,进程的数量都会翻倍;如果
n
是循环的长度,我们说的是进程的总数将是
f(n)=2^n
(产生
2^n-1
进程).让我们通过归纳来证明它是正确的。我们已经看到,这个公式适用于
n=1
n=2
。让我们假设它适用于
n
,并证明它适用于
n+1

如果长度为
n+1
,则在第一次迭代时会产生一个新的过程,因为总共有两个过程仍有
n
迭代要做,这意味着(通过归纳假设)每个过程将产生
2^n-1
过程,这意味着总共
2^(n+1)-2个
进程将在最后的
n个
迭代中产生;我们已经有2个进程,这意味着创建的总进程(包括主进程)将是
2^(n+1)-2+2=2^(n+1)


总之,对于长度
n
的循环,我们有
2^n-1
调用
fork
,这意味着在您的情况下,我们有
2^42-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
#包括
#包括
int main()
{
浮点数和=0;
int i;

对于(i=1;i您认为创建了多少个?子进程在生成时是否也调用fork语句。?正如我们所知,子进程获取父进程的完整副本。因此,在获取父进程副本时,子进程将获取fork语句。子进程是否调用此fork语句?是的,子进程也将调用fork语句t、 是不是应该是2^42,你写的一半?谢谢你的帮助。谢谢你的帮助。