当前位置: 首页 > 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.dtcms.com/a/277239.html

相关文章:

  • 【设计模式】命令模式 (动作(Action)模式或事务(Transaction)模式)宏命令
  • 【STM32实践篇】:F407 时钟系统
  • fiddler/charles https配置完毕依然无法抓取APP https请求的解决办法
  • h() 函数
  • 【RA-Eco-RA6E2-64PIN-V1.0 开发板】ADC 电压的 LabVIEW 数据采集
  • Excel的学习
  • 如何选择合适的AI论文写作工具?七个AI英文论文写作网站
  • leetGPU解题笔记(2)
  • Agent浏览器自动化工具技术原理探析- Palywright VS OS-Atlas
  • 009_API参考与接口规范
  • Android 代码热度统计(概述)
  • Ampace厦门新能安科技Verify 测评演绎数字推理及四色测评考点分析、SHL真题题库
  • 代码随想录算法训练营第三十二天|动态规划理论基础、LeetCode 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 嵌入式单片机开发 - HAL 库引入(HAL 库概述、HAL 库下载)
  • 使用macvlan实现容器的跨主机通信
  • JSON/AJAX/XHR/FetchAPI知识点学习整理
  • Feign实战
  • 六、深度学习——NLP
  • 01_类的概念和定义
  • websocket连接时发生未知错误
  • sqli-labs靶场通关笔记:第9关 时间盲注
  • 快速生成 Android 的 Splash 的 9 Patch 图片
  • 【零基础入门unity游戏开发——unity3D篇】3D光源之——unity反射和反射探针技术
  • AI进化论12:大语言模型的爆发——GPT系列“出圈”,AI飞入寻常百姓家
  • Kafka——Kafka 线上集群部署方案怎么做?
  • c语言初阶 结构体
  • 【Python】venv:配置独立镜像源
  • 常用的docker命令备份
  • 007_用例与应用场景
  • python 列表(List) vs. 元组(Tuple):什么时候该用不可变的元组?它们在性能和用途上有什么区别?