繁体   English   中英

如果分叉时指针的地址被复制过来,那么指针指向的值如何对每个子进程都是唯一的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM