0

从现在开始,我认为在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

对此有任何想法吗?

4

2 回答 2

2

因为进程获得的内存空间是虚拟的。这意味着内存芯片上的实际物理地址可能不同。在您提到的情况下,两个不同进程中的本地对象地址保证在内存芯片上具有不同的私有物理地址。
话虽如此,在某些情况下,来自不同进程的两个非本地对象地址映射到相同的物理地址。最常见的可能是shared libraryshared memory。如果您在编译时
没有指定,那么当两个并发进程使用它时,您实际上可能会最终将相同的虚拟地址映射到相同的物理地址。position-indepedent-codeshared libraryshared library

于 2012-08-08T02:39:13.033 回答
2

在不同的“空间”中意味着不同空间中的“相同”索引点并不指向同一事物。把“空间”想象成一张纸。第 1 页上的“第 3 行的第 4 个字符”与第 2 页上的含义不同。

于 2012-08-08T02:41:45.840 回答