使用 Fork() 创建进程

x89*_*x89 -1 c unix linux fork system-calls

在运行以下代码时:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

p0: x = 1
p1: x = 1
p2: x = 3
p3: x = 3
p4: x = 2
p5: x = 2
Run Code Online (Sandbox Code Playgroud)

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

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

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

ike*_*ami 5

fork 返回以下之一:

  • -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
  }
}
Run Code Online (Sandbox Code Playgroud)