Если адрес указателя копируется при разветвлении, как получается, что значение, на которое указывает указатель, уникально для каждого дочернего процесса? - PullRequest
1 голос
/ 09 марта 2020

Я понимаю, что теоретически (без учета копирования при записи) 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);
   }
}

Я ожидал сценарий 1 из 2 ios: Либо указатель был скопирован с тем же адресом, и, таким образом, изменение значения по указанному адресу изменит значение, на которое указывает в обоих процессах (оба 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", не изменяли значение, сохраняемое в одном и том же адресе в родительском элементе. Как это возможно? Значение адресов не указывает на уникальный раздел памяти в компьютере?

1 Ответ

3 голосов
/ 09 марта 2020

Итак, благодаря очень быстрому отклику, теперь я понимаю, что причина в виртуальной памяти. Адрес относится к адресу указателя относится к адресу в области памяти, но не к физической памяти, хранящей указанное значение.

...