4

子プロセスは親プロセスのヒープアドレス空間にアクセス(読み取りおよび書き込み)できますか?以下は、 http://www.ideone.com/R5vDTで試した、正常に実行されているプログラムです。

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つのプロセスがアドレス空間外のメモリにアクセスしているため、オペレーティングシステムで例外が発生することはありませんか?

4

1 に答える 1

7

2つのプロセスには独自のアドレス空間があり、同じメモリにアクセスしていなくても、各プロセスからは同じように見えます。ただし、多くのオペレーティングシステムは、コピーオンライトと呼ばれるものを実装しています。つまり、forkを呼び出したときではなく、プロセスの1つがメモリを変更したときにメモリがコピーされます。プロセスがメモリに書き込んでいない限り、それらは同じメモリから読み取っています。それらの1つがメモリを変更しようとすると、ある種の例外が発生し、メモリがコピーされて、両方にメモリのプライベート領域があり、他のプロセスからはアクセスできなくなります。

于 2011-10-24T19:40:41.327 に答える