在上一篇介绍fork时我们还遗留了一个问题:
现在我们就可以对这个问题进行解释了,用以下代码更直观看出这个问题
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int g_val = 100;
if (fork() > 0)
{
//parent
while (1)
{
printf("I am father;g_val:%d g_val_addr:%p\n", g_val, &g_val);
sleep(1);
}
}
else
{
//child
int num = 3;
while (num--)
{
if (num == 1)
{
printf("#############################\n");
g_val = 200;
printf("child changed g_val to %d\n", g_val);
printf("#############################\n");
}
printf("I am child:g_val:%d ,g_val_addr:%p\n", g_val, &g_val);
}
}
}
我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:
- 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。
- 但地址值是一样的,说明,该地址绝对不是物理地址!
- 在Linux地址下,这种地址叫做 虚拟地址
- 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理
OS必须负责将 虚拟地址 转化成 物理地址!!!