#include<stdio.h>
int giCtr0;
int main(void){
int iPid;
iPid = fork();
if (iPid == 0){
giCtr0++;
printf("In Child\n");
printf("Addr\t%x Value\t%d\n",&giCtr0,giCtr0);
}
else{
giCtr0+=2;
printf("In Parent\n");
printf("Addr\t%x Value\t%d\n",&giCtr0,giCtr0);
}
return 0;
Выходной сигнал из Ubuntu выглядит следующим образом:
In Parent
Addr 601054 Value 2
In Child
Addr 601054 Value 1
Значение является правильным и, как и ожидалось. Как адрес переменной остается таким же в дочернем и родительском процессах? В коде есть что-то неправильное? Пожалуйста, предложите.
Ожидается. Каждый процесс будет иметь точно такое же содержимое в своем адресном пространстве на fork(), но по мере изменения содержимого в одном процессе Linux предоставит новую страницу физической памяти для региона, который вы изменяете. То есть модуль управления памятью (MMU) на вашем CPU вызовет различные процессы для использования одних и тех же адресов для отображения в разные области физической памяти. – mkimball
Как это могло измениться? Считаете ли вы, что вызов 'fork' каким-то образом волшебным образом определяет каждую переменную в процессе, которая содержит адрес, и изменяет его на наличие другого значения ?! –