Je possède ce programme en C++ qui bifurque deux nouveaux procédés:A propos de l'appel système fork et les variables globales
#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;
}
Les deux processus fourchus font un incrément sur les variables partagées et le processus parent fait la même chose. Comme la variable appartient au segment de données de chaque processus, la valeur finale est 10 car l'incrément est indépendant.
Cependant, l'adresse mémoire des variables partagées est la même, vous pouvez essayer de compiler et de regarder la sortie du programme. Comment cela peut-il être expliqué? Je ne peux pas comprendre cela, je pensais que je savais comment fonctionne fork(), mais cela semble très étrange ..
J'ai besoin d'une explication sur la raison pour laquelle l'adresse est la même, même si elles sont des variables distinctes.
Rappelez-vous que fork fait une copie à l'écriture, donc jusqu'à ce que vous changiez la var c'est la même chose dans tous les processus – Lodle
Il ne peut pas fonctionner autrement, sinon vos pointeurs seraient invalidés après fourchette. Pas très utile ... – Eugene