IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 【Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 ) -> 正文阅读

[系统运维]【Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )





一、进程一描述



在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 ,

在该进程中 , 创建并打开文件 , 为该文件设置大小 ,

使用 mmap 创建 " 文件映射 " , 并通过直接访问内存的方式 , 为该文件设置数据 ;

数据设置完毕后 , 休眠 8 8 8 秒 , 在这段休眠的时间段 , 运行 进程二 , 在 进程二中 , 创建相同文件的 mmap " 文件映射 " , 读取在 进程一 中写入的文件内容 ;





二、进程二描述



进程二 的源码 , 与上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 进程一 源码类似 , 只是将写入 mmap 文件映射 数据 , 修改为 读取 该 文件映射 数据 , 并打印出来 , 源码如下 :

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>

#include <sys/mman.h>
#include <sys/types.h>


/*
    定义一个结构体 代表 " 学生 "
    结构体成员中设置一个 char* 字符串 和 int 类型数据
    分别代表 学生的 姓名 和 年龄
 */
typedef struct
{
    char name[4];  // 姓名
    int age;        // 年龄
}student;


int main(int argc, char** argv)
{
    // 打开文件的 文件描述符
    int fd;

    // 循环控制变量
    int i;

    // 学生结构体指针 , 指向 student 结构体类型变量
    student* p_student;

    // 用于生成姓名字符串
    char name_char;

    // 打开文件
    fd = open(argv[1], O_CREAT | O_RDWR , 00777);

    // 创建文件映射
    // NULL : 映射区的开始地址
    // sizeof(student) * 1 : 文件映射区的长度
    // PROT_READ | PROT_WRITE : 内存保护的标志位 , 该内存页的内容可以 读取 写入 
    // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间
    // fd : 文件描述符 , 被映射的文件 
    // 0 : 被映射文件的偏移量 , 从文件的哪个字节位置开始映射
    p_student = (student*)mmap(NULL, sizeof(student) * 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    // mmap 文件映射创建失败
    if (p_student == (void*) - 1)
    {
        printf("mmap 文件映射创建失败 !");
        return -1;
    }

    // 创建完文件映射之后 , 文件描述符就可以释放了
    close(fd);


    // 打印 10 个 student 结构体的数据内容
    for (i = 0; i < 10; i++)
    {
        // 打印 student 结构体的 name 和 age 成员
        printf("name:%s , age:%d\n", (*(p_student + i)).name, (*(p_student + i)).age);
    }

    printf("第二进程 mmap 文件映射展示完毕 !\n");
    return 0;
}

上述源码 , 放在 mmap_demo_02.c 文件中 , 执行

gcc mmap_demo_02.c -o mmap_demo_02

命令 , 编译该源码 , 编译出的可执行文件为 mmap_demo_02 ;





三、mmap 进程共享内存展示



先执行 进程一 mmap_demo_01 可执行程序 , 进程一 中通过 mmap 文件映射向文件中写出数据后 , 进入休眠阶段 ,

在这里插入图片描述

再执行进程二 mmap_demo_02 , 使用 mmap 文件映射访问 file 文件 , 此时打印出 进程一 中通过 mmap 文件映射写出的文件数据 ;

在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:46:32  更:2022-04-15 00:48:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:37:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码