从现在开始,我认为在调用fork()
之后,局部变量被复制到父进程和子进程中,它们是分开的。但是我尝试在不同的进程中获取每个局部变量的地址,结果证明它们是相同的:
int main(void){
int local = 10;
pid_t childPid;
childPid = fork();
if(childPid == 0 ){
printf("[Child] the local value address is %p\n",&local);
}else if(childPid < 0){
printf("there is something wrong");
}else{
printf("[Parent] the local value address is %p\n",&local);
}
return (EXIT_SUCCESS);
}
输出结果为:
[Parent]本地值地址为0x7fff5277baa8 [Child]本地值地址为0x7fff5277baa8
对此有何想法?
答案 0 :(得分:2)
因为进程获得的内存空间是虚拟。这意味着内存芯片上的实际物理地址可能不同。在您提到的情况下,两个不同进程中的本地对象地址保证在内存芯片上具有不同的私有物理地址。
话虽如此,但是存在来自不同进程的两个非本地对象地址映射到相同物理地址的情况。最常见的可能是shared library
或shared memory
如果在编译position-indepedent-code
时未指定shared library
,则当两个并发进程使用此shared library
时,您实际上可能会将相同的虚拟地址映射到同一物理地址。
答案 1 :(得分:2)
处于不同的空间&#34;意味着&#34;相同&#34;不同空间中的索引点并不是指同一个东西。想想&#34;空格&#34;作为纸片。 &#34;第3行的第4个字符&#34;第1页上的内容与第2页中的内容不同。