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

内存映射区

存储映射区介绍

        存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据,就相当于读文件中的相应字节;将数据写入缓冲区,则会将数据写入文件。这样,就可在不使用read和write函数的情况下,使用地址(指针)完成I/O操作。

        使用存储映射这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。

mmap函数

	函数作用:建立存储映射区函数原型void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);函数返回值:成功:返回创建的映射区首地址;失败:MAP_FAILED宏参数:	addr: 	指定映射的起始地址, 通常设为NULL, 由系统指定length:映射到内存的文件长度prot:	映射区的保护方式, 最常用的:读:PROT_READ写:PROT_WRITE读写:PROT_READ | PROT_WRITEflags:	映射区的特性, 可以是MAP_SHARED: 写入映射区的数据会写回文件, 且允许其他映射该文件的进程共享。MAP_PRIVATE: 对映射区的写入操作会产生一个映射区的复制(copy-on-write), 对此区域所做的修改不会写回原文件。fd:由open返回的文件描述符, 代表要映射的文件。offset:以文件开始处的偏移量, 必须是4k的整数倍, 通常为0, 表示从文件头开始映射。

munmap函数

	函数作用:释放由mmap函数建立的存储映射区函数原型:int munmap(void addr[.length], size_t length);返回值:成功:返回0失败:返回-1,设置errno值函数参数:addr:调用mmap函数成功返回的映射区首地址length:映射区大小(mmap函数的第二个参数)

mmap进程间通信示例:创建write.c、read.c、test.log(里边随便写一些值,不能为空,为空写不进去)

//使用mmap函数完成两个不相干进程间通信 write.c内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>int main()
{//使用mmap函数建立共享映射区//void *mmap(void *addr, size_t length, int prot, int flags,//              int fd, off_t offset);int fd = open("./test.log", O_RDWR);if(fd<0){perror("open error");return -1;}int len = lseek(fd, 0, SEEK_END);//建立共享映射区void * addr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(addr==MAP_FAILED){perror("mmap error");return -1;}memcpy(addr, "0123456789", 10);return 0;
}

//使用mmap函数完成两个不相干进程间通信 read.c内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>int main()
{//使用mmap函数建立共享映射区//void *mmap(void *addr, size_t length, int prot, int flags,//              int fd, off_t offset);int fd = open("./test.log", O_RDWR);if(fd<0){perror("open error");return -1;}int len = lseek(fd, 0, SEEK_END);//建立共享映射区void * addr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(addr==MAP_FAILED){perror("mmap error");return -1;}char buf[64];memset(buf, 0x00, sizeof(buf));memcpy(buf, addr, 10);printf("buf=[%s]\n", buf);return 0;
}

编译后运行,test.log先打开随便赋一些内容,先运行write.c编译后的可执行程序,再运行write.c编译后的可执行程序。

http://www.lryc.cn/news/473302.html

相关文章:

  • es安装拼音分词后Kibana出现内存错误
  • mysql 字符串拼接文本并换行
  • IIC学习总结
  • 【案例学习】暴力破解攻击(Brute Force Attack)
  • Python学习之基本语法
  • QT QDialog::exec()调用时清除部件所有焦点
  • uni-app @click.stop @click.stop.native均不生效
  • 数据可视化工具深入学习:Seaborn 与 Plotly 的详细教程
  • camera和lidar外参标定
  • Redis慢查询分析优化
  • ETL处理全流程
  • 美畅物联丨掌握Wireshark:GB28181协议报文分析实战指南
  • 【python】OpenCV—WaterShed Algorithm
  • CSS flex布局- 最后一个元素占满剩余可用高度转载
  • Camp4-L1:XTuner 微调个人小助手认知
  • Qt:语言家视图
  • 【Paper Note】利用Boundary-aware Attention边界感知注意力机制增强部分伪造音频定位
  • 海外共享奶牛牧场投资源码-理财金融源码-基金源码-共享经济源码
  • iOS静态库(.a)及资源文件的生成与使用详解(OC版本)
  • Python自动化:关键词密度分析与搜索引擎优化
  • 苏州金龙新V系客车创新引领旅游出行未来
  • linux:DNS服务
  • 传奇架设好后创建不了行会,开区时点创建行会没反应的解决办法
  • 【小白学机器学习28】 统计学脉络+ 总体+ 随机抽样方法
  • 安全研究 | 不同编程语言中 IP 地址分类的不一致性
  • 小小的表盘还能玩出这么多花样?华为手表这次细节真的拉满
  • trueNas 24.10 docker配置文件daemon.json无法修改(重启被覆盖)解决方案
  • 数字孪生,概念、应用与未来展望
  • Chromium HTML Input 类型Text 对应c++
  • SpringMvc参数传递