如果调用执行子代码的函数会发生什么?父进程的地址空间被复制,但不能使用父进程的本地变量 . 我知道当使用fork()时,只有在子进程或父进程中进行写操作时才会复制地址空间,因此如果在父进程中进行了写操作,则子进程将获得父地址空间的副本 . 可以将子代码放在单独的函数中吗?
void child(){
//do something
}
int main(int argc, char const *argv[])
{
int x = 0;
int pid;
if((pid=fork()) < 0){
printf("error\n");
exit(1);
}
if(pid==0){
child();
}
x=12;
return 0;
}
1 回答
孩子获得父母地址空间的完整副本 . 因此,子进程可以访问父进程创建的指针,但只能创建直到
fork()
之前的点 . 在fork之后,出于所有编程目的,每个进程都有父进程内存的副本 . 因此,父(或子)的更改将限制为自己的块 .例如,假设父级具有指向字符缓冲区的指针 . 父
fork()
,所以现在父和子都包含指向同一块的相同指针 . 如果父级或子级更改了该缓冲区,则另一个进程不会看到更改 . 在硬件级别,内存块将位于其他位置 . 该进程在虚拟地址空间中运行,因此当两个程序内存块发生更改时,将为每个进程复制该部分内存(以及整个页面) .将子代码放在函数中没有问题,实际上这是个好主意 .