我有一个用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()的工作原理,但这似乎非常奇怪...
我需要解释一下为什么地址相同,尽管它们是不同的变量。