私は2つの新しいプロセスをフォークする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;
}
2つのフォークされたプロセスは共有変数をインクリメントし、親プロセスも同じことを行います。変数は各プロセスのデータセグメントに属しているため、増分は独立しているため、最終的な値は10になります。
ただし、共有変数のメモリアドレスは同じであるため、プログラムの出力をコンパイルして監視してみてください。それはどのように説明できますか?それは理解できません。fork()がどのように機能するかは知っていると思いましたが、これは非常に奇妙に思えます。
別々の変数ですが、アドレスが同じである理由について説明する必要があります。