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

标签 c fork system-calls

我不知道它是如何工作的。fork 系统调用将父进程分成两个进程,它为子进程返回零。根据我的说法,子进程的输出应该是 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;
}

最佳答案

当进程 fork 时,它的地址空间被克隆,所以会有一个带有主线程堆栈的段(var 所在的位置)但是有两个进程引用它:

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

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

当它们中的任何一个试图修改它时,就会生成一个写时复制页面错误,并且数据段正在被操作系统复制:

            +--------+  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。

关于c - fork 调用子进程和父进程后,值会有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35660564/

相关文章:

c - 原始套接字 : inappropriate ioctl

android - cstdlib 的 NDK 错误

C 编程 fork() 多个 pipeline()

c - 为什么这个 fork() 输出产生 8 而不是 5?

c - 在 for 循环说明中 fork

c - "STATUS: Too many open files in system"打开和锁定

c++ - 如何使用 C++ 更改 Windows ncpa.cpl 中显示的网络名称?

c - Mega Arduino 2560 和 Eclipse

c - 双栈套接字上的 getnameinfo() 函数返回不正确的 IP 地址?

linux - 除了 fork 之外,还有没有一次不返回的系统调用?