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

linux--IPC之内存映射

内存映射

是指将磁盘中的数据映射到内存的虚拟地址空间之中,在内存中进行操作的内容会同步到磁盘中的文件中。
在这里插入图片描述

创建内存映射

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
【功能】:将一个文件或者设备的数据映射到内存中
【参数】:
	addr:设置为 NULL, 由内核指定映射的地址(推荐做法)
	length : 要映射的数据的长度,【这个值不能为0。建议使用文件的长度】,获取文件的长度:stat,lseek
	prot : 对申请的内存映射区的操作权限,【这个权限要在用open打开的权限之内】
		PROT_EXEC :可执行的权限
		PROT_READ :读权限
		PROT_WRITE :写权限
		PROT_NONE :没有权限
	flags:
		MAP_SHARED : 映射区的数据会自动和磁盘文件进行同步,进程间通信,必须要设置这个选项
		MAP_PRIVATE` :不同步,内存映射区的数据改变了,对原来的文件不会修改,会重新创建一个新的文件。(写时复制机制)
	fd: 需要映射的那个文件的文件描述符,通过open得到,open的是一个磁盘文件
	offset:偏移量,一般进行特殊指定(指定为0即可),如果使用必须指定的是 `4k` 的整数倍,0表示不偏移
【返回值】:返回【创建的内存的首地址】。失败返回`MAP_FAILED(即把-1转为地址了(void *) -1)


int munmap(void *addr, size_t length);
【功能】:释放内存映射
【参数】:
	addr : 要释放的内存的首地址
	length : 要释放的内存的大小,要和`mmap`函数中的length参数的值一样
		

内存映射在进程间通信的种类:

有关系的进程(亲缘关系)

  • 准备一个大小不是0的磁盘文件
  • 还没有子进程的时候,先创建内存映射区
  • 有了内存映射区之后,创建子进程
  • 父子进程共享创建的内存映射区

没有关系的进程

  • 准备一个大小不是0的磁盘文件
  • 进程1和进程2 分别 通过磁盘文件创建内存映射区,得到一个操作这块内存的指针

注意事项

  1. mmap创建内存映射区的时候,注意prot的权限一定要包含读的权限,并且权限一定要小于open的权限,不能和open的权限有冲突。即PROT_READ或者PROT_READ|PROT_WRITE。
  2. 一个文件对应一个内存映射区,因此也可以进行文件的复制,因为映射返回的是数据在内存的首地址,而更改这些数据又可以使得磁盘的数据发生改变,所以可以实现一个文件复制到另一个文件的操作。
  3. 如果对mmap返回的ptr做ptr++操作会出现什么状况? 是可以操作的,但回收资源的时候,ptr不是原来的ptr了,munmap会失败。
  4. 什么情况下mmap会调用失败?
    1)第二个参数len=0
    2)第三个参数的prot权限不包含读权限以及超过了open的权限
    3)偏移量不为4k的整数倍,返回MAP_FAILED
  5. open的时候可以O_CREAT创建一个新文件来创建映射区吗? 可以,但记得要扩展文件,否则文件的大小为0,用lseek或者truncate
  6. mmap映射之后,关闭fd有影响吗? 映射区还在,关闭fd没有任何影响,因为已经形成了一个映射
  7. 对ptr越界操作会? 操作的是非法内存,会出现段错误
int len = lseek(fdSource, 0, SEEK_END);  //获取文件大小
truncate("target.txt", len); //扩展文件长度

http://www.kler.cn/a/564369.html

相关文章:

  • C++核心指导原则: 常量和不可变性
  • 如何在Oracle Linux 7.9上安装NVIDIA显卡驱动
  • Python基础大全:Python变量详解
  • MySQL MHA 部署全攻略:从零搭建高可用数据库架构
  • 【内存泄漏 | 论文速读】Automated Memory Leak Diagnosisby Regression Testing
  • PG 中级认证专家考证事项
  • 分布式Session
  • 信息系统的安全防护
  • 使用 Java 更新 Word 文档中的图表数据-超详细
  • Linux——进程池
  • 【JavaSE-2】数据类型与变量
  • LVS+Keepalived高可用群集配置案例
  • 【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)
  • Lua的table(表)
  • ISP 常见流程
  • 【Mac电脑本地部署Deepseek-r1:详细教程与Openwebui配置指南】
  • WPF11-附加属性
  • SQL笔记#SQL高级处理
  • cve-2025-25064漏洞分析
  • 记录一次bug,xgplayer西瓜视频播放切进度条视频加载失败