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时不会复制内存,而是在其中一个进程修改内存时.只要没有进程写入内存,它们就会从同一个内存中读取.当其中一个尝试修改内存时,会引发某种类型的异常并复制内存,以便它们都具有内存的私有区域,任何其他进程都无法访问.