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

问题描述

#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

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