【Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )
2023-06-13 09:18:05 时间
文章目录
一、进程一描述
在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 ,
在该进程中 , 创建并打开文件 , 为该文件设置大小 ,
使用 mmap 创建 " 文件映射 " , 并通过直接访问内存的方式 , 为该文件设置数据 ;
数据设置完毕后 , 休眠
秒 , 在这段休眠的时间段 , 运行 进程二 , 在 进程二中 , 创建相同文件的 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 文件映射写出的文件数据 ;
相关文章
- 「从Bochs运行Linux:操作详细介绍」(bochs运行linux)
- Linux服务器硬盘空间扩容:添加硬盘的步骤(linux服务器添加硬盘)
- 原理Linux内核工作队列:实现原理及应用(linux内核工作队列)
- Linux下运行的C语言编程之旅(linux下运行的c程序)
- Linux 下简单取文件后缀名的方法(linux取文件后缀名)
- 如何在Linux系统中配置DNS服务器(linux中dns的配置)
- Android Runs Linux Kernel把Android植入Linux内核(安卓刷linux内核)
- 使用Vim命令掌握Linux技能!(linux中的vim命令)
- Linux系统如何使用命令打开图片(linux打开图片命令)
- Linux下压力测试命令整理(linux压力测试命令)
- 深入Linux:选择最佳内核(linux选择内核)
- Linux硬盘无限延伸:超过2T容量支持(linux超过2t)
- 实现Linux服务器高级编程之路(linux服务器高级编程)
- Linux 内核编译过程解析(linux内核编译详解)
- 管理Linux段页管理:让内存更加高效(linux段页)
- Linux内存挂载技术简明指南(linux内存挂载)
- 分析Linux系统内存Dump数据(linuxdump)
- Linux系统的分支发展史(linux的分支)
- Linux更改文件所属组的方法(linux更改所属组)
- 如何在Linux中删除任务:一步步指南(linux删任务)
- 如何释放 Linux 内存?25 字教程来帮你!(释放linux内存)
- ARM Linux: 驱动工控系统发展(arm linux 工控)
- Linux系统编程:一路攀上豆瓣之巅(linux系统编程 豆瓣)
- Linux内核学习视频实用教程(linux 内核视频教程)