我引用“当进程使用叉()调用创建新进程时,只有共享内存段在父进程和新分叉子进程之间共享,堆栈和堆的副本是根据Silberschatz的”操作系统概念“解决方案为新创建的进程创建的。
但是当我尝试这个程序的时候
#include <stdio.h>
#include <sys/types.h>
#define MAX_COUNT 200
void ChildProcess(void); /* child process prototype */
void ParentProcess(void); /* parent process prototype */
void main(void)
{
pid_t pid;
char * x=(char *)malloc(10);
pid = fork();
if (pid == 0)
ChildProcess();
else
ParentProcess();
printf("the address is %p\n",x);
}
void ChildProcess(void)
{
printf(" *** Child process ***\n");
}
void ParentProcess(void)
{
printf("*** Parent*****\n");
}其结果是:
*** Parent*****
the address is 0x1370010
*** Child process ***
the address is 0x1370010父和子打印堆中相同的地址。
有人能解释一下这里的矛盾吗。请清楚地说明父母和孩子在内存空间中共享的所有内容。
发布于 2014-12-15 15:18:53
引用另一条线上自己的话。
因此,这些虚拟地址是物理地址的转换,并不代表相同的物理内存空间,为了留下一个更实际的例子,我们可以做一个测试,如果我们多次编译和运行一个显示静态变量方向的程序,比如这个程序。
#包括 int (){ static = 0;printf("%p\n",&a);getchar();返回0;}
如果我们直接处理物理内存,就不可能在两个不同的程序中获得相同的内存地址。
并通过多次运行该程序得到了如下结果:

发布于 2014-12-15 15:09:44
是的,两个进程对这个变量都使用相同的地址,但是这些地址被不同的进程使用,因此不在同一个virtual address space中。
这意味着地址是相同的,但它们并不指向相同的物理内存。为了理解这一点,您应该阅读更多关于虚拟内存的内容。
发布于 2014-12-15 15:09:29
地址是相同的,但地址空间不是。每个进程都有自己的地址空间,因此父进程的0x1370010与子进程的0x1370010不相同。
https://stackoverflow.com/questions/27486873
复制相似问题