fork() 如何产生不同的结果?

How is fork() able to produce varied results?

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

int main()
{
    int x = 1;

   /* fork off a child process */
    if (fork()==0)
       x++;

    /* fork off another child process */
    if (fork()==0)
       x++;

    printf("x = %d : ", x); fflush(stdout);

    /* wait for a signal to be received */
    pause();
}

每次我 运行 它都会给出不同的结果。我已经尝试阅读有关原因的信息,但是我无法理解它。这可能的输出是什么?为什么?

每个进程的输出是完全确定的(假设没有错误)。

P1                        P11                       P111
+----------------+        + - - - - - - - -+        + - - - - - - - -+
|  x = 1;        |        :  x = 1;        :        :  x = 1;        :
|  fork(); // !0 |------->:  fork(); // =0 :        :  fork(); // =0 :
|  fork(); // !0 |---+    |  ++x;          |        :  ++x;          :
|  printf();     |   |    |  fork(); // !0 |------->:  fork(); // =0 :
+----------------+   |    |  printf();     |        |  ++x;          |
                     |    +----------------+        |  printf();     |
                     |                              +----------------+
                     |
                     |    P12
                     |    + - - - - - - - -+
                     |    :  x = 1;        :
                     |    :  fork(); // !0 :
                     +--->:  fork(); // =0 :
                          |  ++x;          |
                          |  printf();     |
                          +----------------+
  • P1 输出 1.
  • P11 输出 2.
  • P111 输出 3.
  • P12 输出 2.

但是,根据调度的变化,每个进程的输出出现的顺序是不可预测的。