在Linux上的fork()

时间:2016-01-15 22:02:43

标签: fork

#include<stdio.h> 
int giCtr0;

int main(void){
int iPid;

iPid = fork();
if (iPid == 0){
    giCtr0++;
    printf("In Child\n");
    printf("Addr\t%x Value\t%d\n",&giCtr0,giCtr0);
}
else{
    giCtr0+=2;
    printf("In Parent\n");
    printf("Addr\t%x Value\t%d\n",&giCtr0,giCtr0);
}
return 0;

}

Ubuntu的输出如下:

In Parent
Addr    601054 Value    2
In Child
Addr    601054 Value    1

价值是正确的,正如预期的那样。 如何在子进程和父进程中保持变量的地址相同? 这段代码有什么问题吗?请建议。

2 个答案:

答案 0 :(得分:3)

  1. 类Unix系统中的内存地址是按进程进行的。使用C &运算符获得的地址是OS级构造,而不是直接映射到RAM芯片(或交换出的VM页面)中的位的寻址方案。因此,两个不同进程中的相同地址可能会引用“实际”内存中的两个不同位置。

  2. fork生成父进程的克隆。要使两个进程继续像fork之前那样运行,将复制父进程的整个内存映像以创建子进程的内存映像...因此,从每个进程的角度来看,所有内存地址都是变量仍指向他们之前所做的相同的事情。 (但由于这些流程现在是分开的,因此一个流程中的更改会影响不同的底层存储,而不会影响另一个底层存储。)

答案 1 :(得分:2)

  

如何在子进程和父进程中保持变量的地址相同?

添加到mkimball的评论

Linux实现虚拟内存。这意味着它会设置硬件,因此每个进程都会看到一个虚拟的&#39;内存映射而不是真实的/物理内存映射。

因此,一个进程的内存地址0x601054不一定对应于同一个真实内存&#39; cell&#39;作为另一个进程内的同一地址0x601054