进程概念(二)-fork变量问题

在上一篇介绍fork时我们还遗留了一个问题:
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必须负责将 虚拟地址 转化成 物理地址!!!

上一篇:【Qt】QPushButton 与 QAction 的区别-1. QPushButton


下一篇:DevOps的原理及应用详解(一)