我很困惑.我已经读过,当父进程创建子进程时,
child获取其父级地址空间的副本.复制意味着什么?
如果我使用下面的代码,那么它会打印相同的变量’a’的地址
案例.即在儿童和父母的情况下.那么这里发生了什么?
int main ()
{
pid_t pid;
int *a = (int *)malloc(4);
printf ("heap pointer %p\n",a);
pid = fork();
if (pid < 0) {
fprintf (stderr,"Fork Failed");
exit(-1);
}
else if (pid == 0) {
printf ("Child\n");
printf ("in child heap pointer %p\n",a);
}
else {
wait (NULL);
printf ("Child Complete\n");
printf ("in parent heap pointer %p\n",a);
exit(0);
}
}
最佳答案
子项获取父项地址空间的精确副本,在许多情况下,父项地址空间可能与父地址空间的格式相同.我必须指出,每个人都有自己的虚拟地址空间用于它的内存,这样每个人可以在同一地址拥有相同的数据,但是在不同的地址空间中.此外,linux在创建子进程时使用copy on write.这意味着父和子将共享父地址空间,直到其中一个进行写入,此时内存将物理复制到子进程.这样可以在执行新进程时消除不需要的副本.由于您只是要使用新的可执行文件覆盖内存,为什么还要复制呢?
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。