C fork处理全局变量

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)

有人可以告诉我如何解决这个问题,以便完全理解为什么我得到这个输出?

bma*_*ies 25

Fork将制作该过程的副本.该过程的独立副本.因此,如果一个全局变量在您分叉时包含3,那么该过程的每个副本都会获得它们自己的3.如果它们修改,它们的修改是完全独立的.


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)


R. *_*des 5

fork()时,将在当前状态下创建当前进程的完整副本.这意味着您的初始进程将创建三个处于while循环中间的新进程,每个进程i分别为0,1和2.它还将打印自己的价值观i.

它的每个子节点都会fork()通过打印出初始i值,递增和循环来继续调用循环.这意味着孩子0将打印0,1和2,并产生两个新孩子,"初始"值为i1和2.孩子1将打印1和2并再生成一个孩子,其"初始"值为i2.儿童2将打印2并离开循环.

如果你继续这个推理,你会得出结论,总共有两个0,四个1和八个2将被打印.但是,由于执行顺序取决于操作系统如何安排并发进程,因此您无法保证打印的顺序.