#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
价值是正确的,正如预期的那样。 如何在子进程和父进程中保持变量的地址相同? 这段代码有什么问题吗?请建议。
答案 0 :(得分:3)
类Unix系统中的内存地址是按进程进行的。使用C &
运算符获得的地址是OS级构造,而不是直接映射到RAM芯片(或交换出的VM页面)中的位的寻址方案。因此,两个不同进程中的相同地址可能会引用“实际”内存中的两个不同位置。
fork
生成父进程的克隆。要使两个进程继续像fork
之前那样运行,将复制父进程的整个内存映像以创建子进程的内存映像...因此,从每个进程的角度来看,所有内存地址都是变量仍指向他们之前所做的相同的事情。 (但由于这些流程现在是分开的,因此一个流程中的更改会影响不同的底层存储,而不会影响另一个底层存储。)
答案 1 :(得分:2)
如何在子进程和父进程中保持变量的地址相同?
添加到mkimball的评论
Linux实现虚拟内存。这意味着它会设置硬件,因此每个进程都会看到一个虚拟的&#39;内存映射而不是真实的/物理内存映射。
因此,一个进程的内存地址0x601054
不一定对应于同一个真实内存&#39; cell&#39;作为另一个进程内的同一地址0x601054
。