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 指向的地址即使在写入操作之后也是相同的。操作系统不应该因为一个进程正在访问其地址空间之外的内存而引发异常吗?

4

1 回答 1

7

好吧,这两个进程有自己的地址空间,每个进程看起来都一样,即使它们没有访问相同的内存。但是,许多操作系统实现了一种称为写时复制的功能,这意味着在您调用 fork 时不会复制内存,而是在某个进程修改内存时复制内存。只要没有进程写入内存,它们就会从同一个内存中读取。当其中一个尝试修改内存时,会引发某种类型的异常并复制内存,以便它们都有一个私有的内存区域,任何其他进程都无法访问。

于 2011-10-24T19:40:41.327 回答