【问题标题】:If the address of a pointer is copied over when forking, how is it that the value the pointer is pointing to is unique to each child process?如果在 fork 时复制了指针的地址,那么指针指向的值如何对每个子进程都是唯一的?
【发布时间】:2020-03-09 06:24:34
【问题描述】:

我理解理论上,(不考虑写入时复制),fork 创建一个子进程,该子进程具有父进程的进程控制块的相同副本。这意味着数据、堆栈和堆中的值都被复制过来。 但是,我想看看它是否与指向的指针值/值交互。我做了这个实验。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

int *pointer;

int main () {
   pointer = malloc(sizeof(int));
   *pointer = 3;
   printf("initial pointer value %p\n", pointer);
   printf("pointer points to value: %d\n", *pointer);
   int PID = fork();
   if (PID == 0) {
       printf("child pointer value %p\n", pointer);
       *pointer = 9;
       printf("child pointer points to value: %d\n", *pointer);
   } else {
       wait();
       printf("parent pointer value %p\n", pointer);
       printf("parent pointer points to value: %d\n", *pointer);
   }
}

我预计 2 种情况中的 1 种情况:要么使用相同的地址复制指针,因此更改所述地址处的值将更改两个进程中指向的值(均为 9)。或者,被指向的值被复制了,但是指针的地址会不同。

但是我得到了这个:

initial pointer value 0x1791010
pointer points to value: 3
child pointer value 0x1791010
child pointer points to value: 9
parent pointer value 0x1791010
parent pointer points to value: 3

即尽管为两个进程复制了地址,但更改存储在地址“0x1791010”处的值并没有更改存储在父级相同地址中的值。这怎么可能?地址值不指向计算机中唯一的内存部分吗?

【问题讨论】:

  • Virtual memory 表示两个不同进程中的相同地址不指向内存中相同的物理地址。
  • 看一下虚拟内存,父代的内存空间是在fork上复制的,但它们的底层物理内存可能不一样。
  • 在您刚刚删除的问题中 (stackoverflow.com/questions/61169014/…) 我有答案,如果您想取消删除您的问题,我会要求重新打开它,希望其他 2 人也能这样做

标签: c pointers process fork


【解决方案1】:

所以感谢快速响应,我现在明白原因是虚拟内存。地址指的是指针的地址,指的是内存空间中的一个地址,而不是存储该值的物理内存。

【讨论】:

  • 请注意,虽然这是答案,但实现可能会更改存储在指针中的地址。事实上,C 标准没有地址的概念,因此不能强制它在两个进程中相等。对 C 来说,它只是一些不透明的对象,当被取消引用时,它指向一些有用的东西。如果这个属性保持不变并且两个指针都指向同一个“事物”,那么按照标准,一切都很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多