使用这些fork()语句创建了多少个进程?

时间:2013-10-01 01:31:23

标签: c process operating-system fork

我相信这创造了24个过程;但是,我需要验证。这些问题经常让我感到困惑。谢谢你的帮助!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
  pid_t pid = fork();
  pid = fork();
  pid = fork();
  if (pid == 0)
  {
    fork();
  }
  fork();
  return 0;
}

4 个答案:

答案 0 :(得分:27)

通过这个很容易理由。 fork调用每次执行时都会创建一个额外的进程。该调用在新(子)进程中返回0,在原始(父)进程中返回子进程id(非零)。

pid_t pid = fork();  // fork #1
pid = fork();        // fork #2
pid = fork();        // fork #3
if (pid == 0)
{
  fork();            // fork #4
}
fork();              // fork #5
  1. Fork#1创建了一个额外的进程。您现在有两个流程。
  2. Fork#2由两个进程执行,创建两个进程,总共四个进程。
  3. Fork#3由四个进程执行,创建四个进程,总共八个进程。其中一半有pid==0,一半有pid != 0
  4. Fork#4由fork#3创建的一半进程执行(因此,其中四个)。这创建了四个额外的过程。你现在有12个流程。
  5. Fork#5由剩下的所有12个进程执行,创建了12个进程;你现在有二十四岁。

答案 1 :(得分:3)

以这种方式计算:

从1(主进程)开始,如果fork不在内,则每个fork使它成为两次if(pid == 0)否则将当前进程的1/2添加到当前进程数。

在你的代码中: 1P 得到#1 fork()所以加倍了当前的进程数。现在新的进程数量为2P

得到#2 fork()所以加倍了当前的进程数。现在新的进程数量为4P

得到#3 fork()所以加倍了当前的进程数。现在新的流程数8P

得到了#4 fork(),但等待条件如此(8 + 4 = 12)P

得到#5 fork()所以加倍了当前的进程数。现在新的流程数量为24P

答案 2 :(得分:1)

你是对的。它是24.刚刚在最终返回语句之前编译并运行了w / printf。得到24行输出。

答案 3 :(得分:0)

此声明包含24个以上的子进程。 每次调用fork()都会产生两个进程,即子进程和父进程。因此,第一个fork导致两个进程。这两个进程到达第二个fork(),产生四个进程。最后一个fork()由四个进入,更多的是净八个进程。除了其中一个进程(原始进程)之外的所有进程都是至少一个分叉的子代。