fork 调用子进程和父进程后,值会有什么不同?

What will be the difference in values after fork calls for child and parent process?

我无法理解它 works.The fork 系统调用如何将父进程分成两个进程,它 returns 子进程为零。根据我的输出应该是 glb=101.var=89 用于子进程。但我错了。有人可以解释一下它是如何工作的吗?

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int glb=100;
int main()
{
    int pid;  
    int var =88;
    printf ("Before Fork\n");
    pid=fork();
    if(pid <0)
    {
        perror("fork");
        exit(1);
    }
    if(pid ==0) /**child**/
    {
        glb++;var++;
    }
    else 
    {
        sleep(5);
    }

    printf("pid= %d,glb=%d,var=%d\n",getpid(),glb,var);
    return 0;
}

当进程分叉时,它的地址 space 正在被克隆,因此会有一个带有主线程堆栈的段(var 所在的位置)但是有两个进程引用它:

            +-------+
parent ---> |  var  | <--- child
            +-------+

同样适用于 glb 所在的数据段。

当他们中的任何一个试图修改它时,会产生一个copy-on-write页面错误并且操作系统正在复制数据段:

            +--------+  var++
parent ---> |   88   | <--- child
            +--------+

Handle cow-fault:

            +--------+             +--------+
parent ---> |   88   |  child ---> |   88   |
            +--------+             +--------+

Restart from same instruction:

            +--------+        var++ +--------+
parent ---> |   88   |  child ----> |   88   |
            +--------+              +--------+

            +--------+       printf +--------+
parent ---> |   88   |  child ----> |   89   |
            +--------+              +--------+

所以 child 应该打印 101 和 89,而 parent 应该打印 100 和 88。