fork调用后的地址空间

当进程执行fork()sys调用时,会从中生成子进程。 fork()调用之后的所有代码都被复制到内存的新物理页面,即帧。 我无法可视化子进程的虚拟内存部分。因为在下面的代码中,char变量的地址在child和parent中是相同的。

#include  #include  int main(void) { pid_t pid; char y='Y'; char *ptr; ptr=&y; pid = fork(); if (pid == 0) { y='Z'; printf(" *** Child process ***\n"); printf(" Address is %p\n",ptr); printf(" char value is %c\n",y); sleep(5); } else { sleep(5); printf("\n ***parent process ***\n",&y); printf(" Address is %p\n",ptr); printf(" char value is %c\n",y); } } 

及其输出:

 *** Child process *** Address is 69002894 char value is Z ***parent process *** Address is 69002894 char value is Y 

两个进程中的虚拟地址相同,但物理地址不同。 您的进程只允许访问虚拟内存。 在具有虚拟内存function的机器中,内存管理单元将虚拟地址转换为物理地址。

通常,操作系统使用写时复制方案来实现分叉。 这意味着它们将具有相同的物理地址,直到某些东西试图写入内存页面。 当你把:

 y = 'Z' 

操作系统复制了y所在的内存页面,并将该虚拟地址重新分配给新的物理地址。

根据我的说法,你运行’execve’命令后你会看到差异。 在此之前,孩子与父母共享相同的图像和空间。