在使用分叉时如何映射内存?

我是新来的“fork()”,我到处读到,当一个fork()被调用当前(调用)进程的确切副本开始。现在,当我运行下面的代码,应该有两个不同的进程,分配给他们的variables和函数的内存位置。

#include<stdio.h> int i=10; int pid; int main(){ if((pid=fork())==0){ i++;//somewhere I read that separate memory space for child is created when write is needed printf("parent address= %p\n",&i);// this should return the address from parent's memory space }else{ i++; i++; printf("child address= %p\n",&i);// this should return the address of child's memory space } wait(0); return(0); } 
为什么输出看起来像:: 
孩子地址:: 804a01c 
父母地址:: 804a01c

为什么父母和孩子的地址都一样?

有两个不同的存储位置分配给他们的变数和功能。

不; Linux实现虚拟内存 ,这意味着每个进程都有自己完整的地址空间。 因此,在fork ,两个进程都会看到内存对象副本的相同地址。

(另外:VM也会导致代码在物理内存中的进程之间共享,所有的数据只能在写入时被复制 。)

地址是过程本地的。 804a01c在一个进程中与另一个进程中的804a01c不一样。

由于虚拟内存 :两个地址空间看起来与相应的进程相同。 那些存储的物理内存是不同的。 然而,实际上,通过将相应的不同虚拟页面映射到相同物理页面的存储器优化(由大多数内核实现)使其复杂化,直到这些过程中的一个写入该页面的存储器为止,此时页面被物理复制到另一个物理地址(虚拟页面被重新映射为进程)。

还有很多其他的复杂情况:最为人认识的是fork()的返回值在进程间是不同的,尽管这通常是寄存器值的差异,而不是内存。 但是,打开的文件和其他一些资源可能被标记为不可继承的,所以可能会有其他的区别 – 虽然很小,但有时是有用的。