У меня есть эта программа в C++, что вилы два новых процесс:О вилке вызова системы и глобальных переменных
#include <pthread.h>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstdlib>
using namespace std;
int shared;
void func(){
extern int shared;
for (int i=0; i<10;i++)
shared++;
cout<<"Process "<<getpid()<<", shared "
<<shared<<", &shared "
<<&shared<<endl;
}
int main(){
extern int shared;
pid_t p1,p2;
int status;
shared=0;
if ((p1=fork())==0) {func();exit(0);};
if ((p2=fork())==0) {func();exit(0);};
for(int i=0;i<10;i++)
shared++;
waitpid(p1,&status,0);
waitpid(p2,&status,0);;
cout<<"shared variable is: "<<shared<<endl;
cout<<"Process "<<getpid()<<", shared "
<<shared<<", &shared "
<<&shared<<endl;
}
Два раздвоенные процессы делают приращение на общем переменных и родительский процесс делает то же самое. Поскольку переменная принадлежит сегменту данных каждого процесса, конечное значение равно 10, потому что приращение является независимым.
Однако адрес памяти общих переменных одинаковый, вы можете попробовать компилировать и наблюдать за выходом программы. Как это можно объяснить? Я не могу этого понять, я думал, что знаю, как работает fork(), но это кажется очень странным.
Мне нужно объяснение, почему адрес тот же, хотя они являются отдельными переменными.
запомнить fork делает копию при записи, таким образом, пока вы не измените var, это будет одинаково во всех процессах. – Lodle
Это не может работать иначе, иначе ваши указатели будут признаны недействительными после вилка. Не очень полезно ... – Eugene