[英]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 创建一个子进程,该子进程具有父进程的进程控制块的相同副本。 这意味着数据、堆栈和堆中的值都被复制过来。 但是,我想看看它是否与指向的指针值/值相互作用。 我做了这个实验。
#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 种情况中的一种:要么使用相同的地址复制指针,因此更改所述地址处的值将更改两个进程(均为 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”中的值并没有更改存储在父进程相同地址中的值。 这怎么可能? 地址值是否未指向计算机中唯一的内存部分?
所以感谢非常快速的响应,我现在明白原因是虚拟内存。 地址指的是指针的地址,指的是内存空间中的地址,而不是存储该值的物理内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.