2011-10-24 21 views
4

子プロセスが親プロセスのヒープアドレス空間にアクセス(読み書き)することはできますか? 以下は、私が正常に動作しているhttp://www.ideone.com/R5vDTにしようとしたプログラムです。fork()によって作成された子プロセスによる親プロセスのヒープセクションへのアクセスは合法ですか?

int main(){ 
     int *p = (int*)malloc(sizeof(int)); 
     if(fork()){ 
     //parent process 
       *p = 25;//Write 
       printf("Parent %d: %d %p\n", getpid(), *p, p);//Read 
     }else{ 
     //child process 
       *p = 15;//write 
       printf("Child %d: %d %p\n", getpid(), *p, p);//read 
     } 
     return 0; 
}  

出力は次のとおりです。

Parent 30597: 25 0x9781008 
Child 30600: 15 0x9781008 

私はCOW(コピーオンライト)について読みましたが、Pが指すアドレスがした後も同じです書き込み動作。 1つのプロセスがそのアドレス空間外のメモリにアクセスしているため、オペレーティングシステムが例外を送出してはいけませんか?

答えて

7

まあ、2つのプロセスは、同じメモリにアクセスしていなくても、プロセスのそれぞれが同じに見える独自のアドレス空間を持っています。しかし、多くのオペレーティングシステムではcopy-on-writeと呼ばれるものが実装されています。つまり、フォークを呼び出すときにメモリがコピーされず、プロセスの1つがメモリを変更するときです。プロセスがメモリに書き込んでいない限り、同じメモリから読み込み中です。そのうちの1人がメモリを変更しようとすると、何らかのタイプの例外が発生し、メモリがコピーされ、メモリのプライベート領域があり、他のプロセスがアクセスできない状態になります。

+0

上記のプログラムと同様に、親プロセスと子プロセスのそれぞれで書き込み操作が実行されています。ヒープセクションをコピーしてはいけませんか? 書き込み操作後のメモリのアドレスを示すプログラムは次のとおりです。http://www.ideone.com/nRa9a – Monish

+0

私が指摘したように、アドレス空間は両方のプロセスと同じです。したがって、どちらもアドレス0x9781008にアクセスできます。ただし、これは物理的な場所が同じではないため、あるプロセスがその場所の内容を変更すると、他のプロセスとまったく同じ場所の内容は変更されません。 1つのプロセスでアドレスの内容を変更し、変更後に他のプロセスの場所の内容を印刷することで、これを試すことができます。あなたのOSがCOWを実装しているかどうかは、実際にあなたのプログラムと無関係です。それは、コピーが発生したときの単なる問題です。 – torgny

関連する問題