【问题标题】:Linux Fork functionality in a loop [duplicate]循环中的Linux Fork功能[重复]
【发布时间】:2014-08-30 11:17:30
【问题描述】:

谁能解释一下这个 C 代码是如何工作的?完成后会产生多少个进程?

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

【问题讨论】:

  • 你认为创造了多少?

标签: c linux unix


【解决方案1】:

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

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

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

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

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

总之,对于长度为n 的循环,我们有2^n - 1fork 的调用,这意味着在您的情况下,我们有2^42 - 1 由主进程及其后代产生的新进程。

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

使用这个程序来获得答案:

#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语句吗?
  • 是的子进程也会调用fork语句。
  • 不应该是2^42,你写的一半吗?
  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多