我了解,从理论上讲,(在写时不考虑复制),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地址中的值。这怎么可能?地址值是否不指向计算机中内存的唯一部分?
因此,由于反应非常迅速,我现在知道原因是虚拟内存。该地址指的是指针的地址,指的是内存空间中的地址,但不是存储该值的物理存储器。