使用 Fork() 创建进程

Process Creation Using Fork()

在 运行 下面的代码:

#include <stdio.h>
#include <unistd.h>
static int x = 0;
int main(int argc, char *argv[])
{
    pid_t p = getpid();
    fork();
    x++;

    if (! fork()) {
      x++;
      if (fork()) {
          x++;
      }
    }

    printf("p%d: x = %d\n", getpid() - p, x);
    sleep(60);
     return 0;
}

我得到以下输出:

p0: x = 1
p1: x = 1
p2: x = 3
p3: x = 3
p4: x = 2
p5: x = 2

我不太明白这些值是如何递增的以及在何处递增。 原始进程 (p0) 执行 main() 函数。第一个 fork() 创建一个 子进程 (p1)。然后 p0 和 p1 都将它们的 x 副本设置为 1。

接下来,两个进程在第二个 fork 上创建另一个子进程 (p2 和 p3)。两个新的子进程 p2 并且 p3 增加他们的 x 副本,即他们的 x 副本变为 2。但是p0和p1呢?他们不增加价值吗?

下一步是什么? p4 和 p5 的值是如何递增的?有人可以解释一下步骤吗?

我认为造成您误解的关键在于 fork 系统调用的 return 值。 调用 fork 时,它 return 为新创建的进程(又名子进程)和旧进程(又名父进程)设置了不同的值。

在子进程中,fork returns 0.

在父进程中,fork return子进程的PID。

比如写if (fork())时,父进程会进入if子句,子进程不会。它也以另一种方式工作 - 当写 if (!fork()) 时,子进程将进入 if 子句,但父进程不会。

fork returns 以下之一:

  • -1 出错(并设置 errno)。
  • 0中子
  • 父项中子项的 pid(真值)。

假设 fork 没有失败,这意味着 !fork() 仅在子项中为真,而 fork() 仅在父项中为真。

                                       p0 p1 p2 p3 p4 p5
                                       -- -- -- -- -- --
static int x = 0;                   x = 0

// p1 created as a copy of p0.
fork();                                 0  0

x++;                                    1  1

// p2 created as a copy of p0.
// p3 created as a copy of p1.
if (! fork()) {                         1  1  1  1
  // Only p2 and p3 reach here.
  x++;                                  1  1  2  2

  // p4 created as a copy of p2.
  // p5 created as a copy of p3
  if (fork()) {                         1  1  2  2  2  2
      // Only p2 and p3 reach here.
      x++;                              1  1  3  3  2  2
  }
}