Bru*_*uno 8 c fork process global-variables
我不理解这个程序的输出:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
int i = 0;
int main()
{
while(i<3)
{
fork();
printf("%d\n",i);
++i;
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0
1
2
2
1
2
0
1
2
2
2
1
2
2
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何解决这个问题,以便完全理解为什么我得到这个输出?
Pau*_*l R 16
将代码更改为此,输出应该更有意义:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int i = 0;
int main()
{
while (i < 3)
{
fork();
printf("pid = %d, i = %d\n", getpid(), i);
++i;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
fork()时,将在当前状态下创建当前进程的完整副本.这意味着您的初始进程将创建三个处于while循环中间的新进程,每个进程i
分别为0,1和2.它还将打印自己的价值观i
.
它的每个子节点都会fork()
通过打印出初始i
值,递增和循环来继续调用循环.这意味着孩子0将打印0,1和2,并产生两个新孩子,"初始"值为i
1和2.孩子1将打印1和2并再生成一个孩子,其"初始"值为i
2.儿童2将打印2并离开循环.
如果你继续这个推理,你会得出结论,总共有两个0,四个1和八个2将被打印.但是,由于执行顺序取决于操作系统如何安排并发进程,因此您无法保证打印的顺序.