问题描述
#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
。
然而,根据调度的变化,每个进程的输出出现的顺序是不可预测的。