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

时间:2011-10-24 19:28:00

标签: 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;
}     

输出是:

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

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

1 个答案:

答案 0 :(得分:7)

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