15

我相信这会创建 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

4 回答 4

35

这很容易推理。该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 创建的一半进程执行(因此,其中四个)。这会创建四个额外的过程。您现在有十二个进程。
  5. Fork #5 由所有剩余的 12 个进程执行,从而创建了 12 个以上的进程;你现在有二十四个。
于 2013-10-01T01:47:09.963 回答
3

这样计算:

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

在您的代码中: 1P Got #1 fork() 因此将当前进程数加倍。现在新进程数2P

得到#2 fork() 使当前进程数加倍。现在新进程数 4P

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

得到了 #4 fork() 但等待它处于 if 条件所以 (8+4 = 12)P

得到#5 fork() 所以将当前进程数加倍。现在新进程数 24P

于 2015-10-17T01:51:42.227 回答
1

你是对的。它是 24。刚刚编译并在最后的 return 语句之前使用 printf 运行它。有 24 行输出。

于 2013-10-01T01:41:06.193 回答
0

该语句有 24+ 子进程。每次调用 fork() 都会产生两个进程,即子进程和父进程。因此,第一次分叉导致两个进程。这两个进程到达第二个 fork(),产生四个进程。最后的 fork() 由这四个到达,从而增加了八个进程。除了这些进程中的一个(原始进程)之外,所有进程都是至少一个分叉的子进程。

于 2018-04-04T05:25:26.347 回答