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