使用fork创建的新进程,但为变量打印相同的地址

Ram*_*man 1 c operating-system fork

我有以下代码:

#include<stdio.h>
#include<unistd.h>
int main()
{
    int a=0;
    printf("before: %d %p\n",a,&a);
    int t=fork();
    if(t==0)
    {
        a=a+5;
        printf("child: %d %p\n",a,&a);
    }
    else
    {
        a=a+10;
        printf("parent: %d %p\n",a,&a);
    }
    //printf("both: %d %p\n",a,&a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么所有地址都打印相同?我想在调用fork时会创建一个新的变量副本.它与虚拟地址和物理地址有什么关系吗?如果是这样,相同的虚拟地址如何映射到不同的物理地址?

Bas*_*tch 6

地址是相同的,因为每个进程(父和子)都有自己的 虚拟地址空间.Linux计算机具有虚拟内存(由内核和处理器提供).

fork系统调用是"神奇"复制父进程的虚拟地址空间到子进程的虚拟地址空间(除的结果fork).此复制使用惰性写入时复制技术,因此非常有效.内核正在管理MMU(用于虚拟内存并实现每个虚拟地址空间)

阅读高级Linux编程(它有几章与之相关)并仔细分叉(2).

BTW,养成fflush(NULL); 以前 打电话的习惯fork.见fflush(3).