【发布时间】:2010-11-18 04:07:19
【问题描述】:
我有这个 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 之前它在所有进程中都是相同的
-
它不能以任何其他方式工作,否则你的指针将在分叉后失效。不是很有用...
标签: c++ unix linux-kernel fork