该文章转自朱云翔老师博客:zhuyunxiang.csai.cn/
在父进程malloc的地址空间,fork之后,在子进程中是copy一份,还是共享呢?
写一段程序试验一下:
- #include <stdio.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- int main()
- {
- char *p = (char*)malloc(10);
- strcpy (p, "ccc");
- printf ("p address:%p, p = %s/n", p, p);
- pid_t pid = fork();
- if (0 == pid)
- {
- strcpy (p, "ccc111");
- printf ("child p address:%p, p = %s/n", p, p);
- sleep (10);
- printf ("child p address:%p, p = %s/n", p, p);
- }
- else if (pid > 0)
- {
- sleep(3); //让子进程先执行
- strcpy (p, "ccc222");
- printf ("parent p address:%p, p = %s/n", p, p);
- }
- free(p);
- return 0;
- }
运行结果及分析略了(好像没法粘贴图片)。
分析运行结果,可知子进程确实是copy了一份,但通过%p打印出来的地址值是相同——这只能说明他们的虚拟地址是一样,但父子
进程的物理地址是不一样的。
每个进程都有自己的虚拟地址空间,但不同进程的相同地址空间事实上具有不同的物理块。