当前位置: 首页 > news >正文

mmap映射文件

 

目录

 一、前言

二、解决方法

三、mmap模拟

3.1代码

3.2过程

3.3mmap返回值


 一、前言

        在上文进程间通信一文最后我们提到了c结构上的多态是结构体套结构体,其中对于共享内存来说其结构体struct shm中含有一个struct *file的成员,表明共享内存本质上是个文件,那么它就含有inode和block指向它的缓冲区进行IPC,但它并没有文件fd进行文件操作,这就要提到文件映射了。

二、解决方法

        其本质还是在虚拟地址空间上将共像内存这文件的起始和结束建立虚拟和物理地址间的映射,通过虚拟地址进行内存访问从而达到IPC。

三、mmap模拟

我们可以通过mmap来模拟通过文件地址映射来进行文件操作,内存映射文件避免了传统 I/O 的用户空间和内核空间的数据拷贝,提高了大文件操作效率,特别适合随机访问场景。

3.1代码

#include <iostream>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>int main() {const char* filename = "test.txt";const char* message = "Hello, mmap!";const size_t size = 13;// 创建并写入测试文件int fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("open");return 1;}lseek(fd, size - 1, SEEK_SET);write(fd, "", 1);// 内存映射文件char* map = static_cast<char*>(mmap(nullptr,        // 让系统选择映射地址size,           // 映射大小PROT_READ | PROT_WRITE,  // 可读可写MAP_SHARED,     // 更改会写回文件fd,             // 文件描述符0               // 从文件起始位置开始映射));if (map == MAP_FAILED) {perror("mmap");close(fd);return 1;}// 写入数据到映射区域memcpy(map, message, size);// 同步到磁盘if (msync(map, size, MS_SYNC) == -1) {perror("msync");}// 解除映射if (munmap(map, size) == -1) {perror("munmap");}close(fd);std::cout << "文件映射完成,内容已写入 " << filename << std::endl;return 0;
}    

3.2过程

3.3mmap返回值

http://www.xdnf.cn/news/1116289.html

相关文章:

  • 理解 Robots 协议:爬虫该遵守的“游戏规则”
  • HTML 标题标签
  • AI驱动的软件工程(上):人机协同的设计与建模
  • Python 学习之路(十)--常见算法实现原理及解析
  • 深度学习-循环神经网络RNN
  • 谷歌推出Vertex AI Memory Bank:为AI智能体带来持久记忆,支持连续对话
  • MongoDB性能优化实战指南:原理、实践与案例
  • RedisJSON 技术揭秘(五)`JSON.ARRPOP` 原子弹出 修改数组的终极手段
  • Java设计模式之行为型模式(命令模式)介绍与说明
  • 串口A和S的含义以及RT的含义
  • 深入理解观察者模式:构建松耦合的交互系统
  • 设计模式深度解析:单例、工厂、适配器与代理模式
  • Word中的批注显示与修订显示
  • STM32 | HC-SR04 超声波传感器测距
  • 洛谷 P13014:[GESP202506 五级] 最大公因数
  • CentOS系统下前后端项目部署攻略
  • 【MLLM】多模态理解GLM-4.1V-Thinking模型
  • 深度学习图像分类数据集—水质量识别分类
  • java.net.InetAddress
  • Extended Nested Arrays for Consecutive Virtual Aperture Enhancement
  • RHCIA第二次综合实验:OSPF
  • 印度纱丽变革:传统靛蓝工艺在无性别斗篷中的延续
  • CMSIS(Cortex Microcontroller Software Interface Standard)ARM公司为 Cortex-M 系列处理器
  • docker 设置代理以及配置镜像加速
  • VISUALBERT:一个简单且高效的视觉与语言基线模型
  • JavaScript加强篇——第九章 正则表达式高级应用(终)
  • java+vue+SpringBoo中小型制造企业质量管理系统(程序+数据库+报告+部署教程+答辩指导)
  • archive/tar: unknown file mode ?rwxr-xr-x
  • Java行为型模式---策略模式
  • 低代码引擎核心技术:OneCode常用动作事件速查手册及注解驱动开发详解