首页 > 系统相关 >为何fork时父子进程中的变量地址相同?

为何fork时父子进程中的变量地址相同?

时间:2023-03-09 23:34:10浏览次数:131  
标签:fork pid 父子 地址 num printf 进程

为何fork时父子进程中的变量地址相同?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    // 当 pid > 0 时,说明这是在 父 进程中,并且此时的 pid 即为子进程的 id
    // 当 pid == 0 时,说明这是在 子 进程中,此时可通过 getpid 来获取子进程的id
    // 当 pid == -1 时,说明创建子进程失败,此时会将 错误信息 “放入” errno 全局变量中
    pid_t pid = fork();
    int num = 100;

    if (pid > 0) {
        // 这是父进程
        printf("son's pid = %d\\n", pid);
        num += 10;
        printf("dad process: num = %d\\n", num);
        printf("num's addr = %p\\n", &num);
    } else if (pid == 0) {
        // 这是子进程
        printf("son is created, it's pid = %d\\n", getpid());
        num -= 10;
        printf("son process: num = %d\\n", num);
        printf("num's addr = %p\\n", &num);
    }

    printf("together, num = %d\\n", num);
    return 0;
}

执行上述代码,结果如下:

image

可以看到,我们在最开始定义的num = 100,其后父子进程对它的修改都是独立的;

因为 fork 实现的是写时拷贝(这是一种推迟甚至避免拷贝的技术),

  • 当父子进程都对num进行读操作时,其共用一片地址;
  • 而当它们都对num进行写操作时,子进程会copy一份父进程的用户地址空间,并在这之上进行修改。

这就意味着num​ 在父子进程中的地址不同(即不指向同一片空间)。

但是在父子进程中分别输出num的地址时,它们却是一样的,这是为什么呢?

其原因如下:

num 相对于两个进程的逻辑地址一样 ,但是映射在物理空间就不一样了(虚拟空间每个进程都是共享的,映射到物理空间就可能会不一样)。

不同的进程访问同样的逻辑地址而对应的物理地址不同,是由于各自页表的不同。

linux系统下每个进程都拥有自己的页表,父进程fork出新的子进程时,子进程拷贝一份父进程的页表,且父子进程将页表状态修改为写保护。当父进程或子进程发生写操作时将会发生缺页异常,缺页异常处理函数将会为子进程分配新的物理地址。

标签:fork,pid,父子,地址,num,printf,进程
From: https://www.cnblogs.com/liuyxcc/p/why-is-the-variable-address-in-the-process-of-father-and

相关文章

  • web浏览器地址栏输入内容后经历了哪些过程?
    过程1.DNS域名解析,找到对应的IP2.根据IP找到对应的服务器,TCP三次握手建立连接3.发起http请求4.服务器响应http请求,浏览器得到html代码5.浏览器解析html代码,并请求代码中所......
  • Microsoft Visio 2021 专业版 for Windows 官网下载地址
    MicrosoftVisio2021专业版是一款流程图和图表制作软件,它可以帮助用户快速创建各种类型的图表、流程图、组织结构图、楼层图等等。以下是该软件的详细简介: 用户......
  • Microsoft Project 2021 专业版 for Windows 官网下载地址
    MicrosoftProject2021专业版是一款基于Windows操作系统的项目管理软件,它提供了一系列工具和功能,帮助用户规划、执行和监督项目。以下是该软件的详细介绍:  ......
  • linux 配置IP地址的三种方法
    方法1:图形化界面打开网络,直接配置:IP:172.16.129.108子网掩码:255.255.255.0网关:172.16.129.254方法2:ifconfig命令使用ifconfig命令配置ip地址,通常用来临时测试用,重启后ip地址......
  • .netcore 静态文件地址访问
    首先在StartUp.cs文件里面注册管道如:需要在网站里面的files的文件对外访问app.UseStaticFiles();app.UseFileServer(newFileServerOptions{......
  • SQL SERVER 下载地址
    SQLServer2019Enterprise(x64)-DVD(Chinese-Simplified)企业版ed2k://|file|cn_sql_server_2019_enterprise_x64_dvd_2bfe815a.iso|1632086016|58C258FF0F1D006DD3......
  • VMware虚拟机IP地址下发
    Windowsserver2012实现DHCP下发IP地址1.首先创建两个windowsserver2012版本的虚拟机,进行基础配置时,保证每个虚拟机处在同一lan网段。2.进入虚拟机先关闭两个虚拟机......
  • windows server 2012 DHCP下发IP地址
    在配置之前,将两台虚拟机的防火墙关闭,将属于服务端的IP地址手动配置首先保证两台虚拟机在同一lan区段点击添加角色与功能,选择DHCP服务器添加功能后,安装DHCP点击工......
  • 【随手记】require编译问题-- vue项目动态生成的img地址信息,webpack无法打包问题
    问题vue项目动态生成的img地址信息,webpack无法打包问题//这样动态引入的地址,地址无效,因为没有被打包<img:src="imgSrc">原因Webpack资源打包时的特点webpack不......
  • Qt获取ip和mac地址
    准确获取mac地址QStringMainWindow::getHostMacAddress(){QList<QNetworkInterface>nets=QNetworkInterface::allInterfaces();//获取所有网络接口列表......