如果在分叉时复制了指针的地址,那么该指针所指向的值对于每个子进程如何是唯一的?

问题描述 投票:1回答:1

我了解,从理论上讲,(在写时不考虑复制),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”处的值并不会更改存储在父对象的SAME地址中的值。这怎么可能?地址值是否不指向计算机中内存的唯一部分?

c pointers process fork
1个回答
3
投票

因此,由于反应非常迅速,我现在知道原因是虚拟内存。该地址指的是指针的地址,指的是内存空间中的地址,但不是存储该值的物理存储器。

© www.soinside.com 2019 - 2024. All rights reserved.