c - 做 fork 时有趣的 parent 和 child 的行为

标签 c operating-system fork

谁能解释一下下面程序的输出。为什么我为 parent 和 child 获得相同的 &a 值。

它们必须具有不同的物理地址。如果我认为我正在获取虚拟地址,那么它们怎么可能具有相同的虚拟地址,因为据我所知,每个物理地址都唯一绑定(bind)到虚拟地址。

#include <stdio.h>
#include <stdlib.h>
int main(void) {


    int pid=fork();
      int a=10;
    if(pid==0)
        {
            a=a+5;
            printf("%d %d\n",a,&a);
        }
        else
        {
            a=a-5;
            printf("%d %d\n",a,&a);
        }
        return 0;
}

最佳答案

子进程从父进程继承其虚拟地址空间,即使在子进程写入页面后虚拟地址开始引用不同的物理地址。这称为写时复制 (CoW) 语义。

因此,在父级 &a 中映射到某个物理地址。 Fork 最初只是复制映射。然后,当进程写入 a 时,CoW 启动,在子进程中,复制包含 a 的物理页面,更新虚拟地址映射以引用副本和两个进程都有自己的 a 副本,在相同的虚拟地址 &a 但在不同的物理地址。

each physical address is uniquely bound to virtual address

那不是真的。物理内存地址可能未映射,也可能映射到一个或多个进程地址空间中的多个虚拟地址。

反过来,一个虚拟地址可以映射到多个物理地址,只要这些虚拟地址存在于不同进程的虚拟地址空间中即可。

[顺便说一句,您无法使用 %d 可靠地打印内存地址(这恰好适用于 32 位 x86)。请改用 %p。另外,fork 的返回类型是pid_t,而不是int。]

关于c - 做 fork 时有趣的 parent 和 child 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13335344/

相关文章:

c - 如何使用strtok分隔和获取新的字符串

c - `for(;;)` 不会评估为 false 因为它是一个空语句吗?

windows - 是否有 "free"方法可以在不同操作系统上进行测试?

operating-system - 堆栈与缓冲区

c++ - IPC使用多个管道和 fork 进程来运行Python程序

c - 使用 fork() 的进程树不均匀

c - 从使用 dlopen 加载的共享库中引用全局符号

c++ - MATLAB 在 mex_compile Linux 中找不到支持的编译器或 SDK

python - 如何从桌面在另一个位置启动 python 脚本(带参数)

c - 在 C 中一起实现管道和重定向