子プロセスが親プロセスのヒープアドレス空間にアクセス(読み書き)することはできますか? 以下は、私が正常に動作している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つのプロセスがそのアドレス空間外のメモリにアクセスしているため、オペレーティングシステムが例外を送出してはいけませんか?
上記のプログラムと同様に、親プロセスと子プロセスのそれぞれで書き込み操作が実行されています。ヒープセクションをコピーしてはいけませんか? 書き込み操作後のメモリのアドレスを示すプログラムは次のとおりです。http://www.ideone.com/nRa9a – Monish
私が指摘したように、アドレス空間は両方のプロセスと同じです。したがって、どちらもアドレス0x9781008にアクセスできます。ただし、これは物理的な場所が同じではないため、あるプロセスがその場所の内容を変更すると、他のプロセスとまったく同じ場所の内容は変更されません。 1つのプロセスでアドレスの内容を変更し、変更後に他のプロセスの場所の内容を印刷することで、これを試すことができます。あなたのOSがCOWを実装しているかどうかは、実際にあなたのプログラムと無関係です。それは、コピーが発生したときの単なる問題です。 – torgny