是通过子进程(由fork()创建)合法访问父进程的堆部分吗?

mon*_*001 4 operating-system fork address-space

子进程是否可以访问(读取和写入)父进程的堆地址空间?以下是我在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;
}     
Run Code Online (Sandbox Code Playgroud)

输出是:

Parent 30597: 25 0x9781008
Child 30600: 15 0x9781008
Run Code Online (Sandbox Code Playgroud)

我已经读过COW(写入时复制),但写入操作后,p指向的地址是相同的.操作系统是否应该引发异常,因为一个进程正在访问其地址空间之外的内存?

小智 7

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