子进程是否可以访问(读取和写入)父进程的堆地址空间? 以下是我在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指向的地址也是相同的。操作系统是否应该引发异常,因为一个进程正在访问其地址空间之外的内存?
答案 0 :(得分:7)
嗯,这两个进程有自己的地址空间,即使它们没有访问同一个内存,每个进程看起来都是一样的。但是,许多操作系统实现了一种称为写时复制的功能,这意味着在调用fork时不会复制内存,而是在其中一个进程修改内存时。只要没有进程写入内存,它们就会从同一个内存中读取。当其中一个尝试修改内存时,会引发某种类型的异常并复制内存,以便它们都具有内存的私有区域,任何其他进程都无法访问。