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