void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 创建共享内存映射

参数:
addr: 指定映射区的首地址。通常传NULL,表示让系统自动分配

​ length:共享内存映射区的大小。(<= 文件的实际大小,通常为文件大小)

​ prot: 共享内存映射区的读写属性。PROT_READ(读)、PROT_WRITE(写)、PROT_READ|PROT_WRITE(读写)

​ flags: 标注共享内存的共享属性。

​ MAP_SHARED(共享,会将映射区所做的操作反映到物理设备(磁盘)上。)

​ MAP_PRIVATE(私有,映射区所做的修改不会反映到物理设备。 )

​ fd: 用于创建共享内存映射区的那个文件的 文件描述符。

​ offset:默认0,表示映射文件全部。偏移位置。需是 4k 的整数倍。

返回值:

​ 成功:映射区的首地址。

​ 失败:MAP_FAILED (void*(-1)), errno

int munmap(void *addr, size_t length); 释放映射区。

addr:mmap 的返回值

length:大小

使用注意事项:

  1. 用于创建映射区的文件大小为 0,实际指定非0大小创建映射区,出 “总线错误”。

  2. 用于创建映射区的文件大小为 0,实际制定0大小创建映射区, 出 “无效参数”。由1.2条可得,用于映射的文件必须要有实际大小;

  3. 用于创建映射区的文件读写属性为,只读。映射区属性为 读、写。 出 “无效参数”。

  4. 创建映射区,需要read权限。当访问权限指定为 “共享”MAP_SHARED时, mmap的读写权限,应该 <=文件的open权限。 只写不行。

  5. 文件描述符fd,在mmap创建映射区完成即可关闭。后续访问文件,用 地址访问。

  6. offset 必须是 4096的整数倍。(MMU 映射的最小单位 4k )

  7. 对申请的映射区内存,不能越界访问。

  8. munmap用于释放的 地址,必须是mmap申请返回的地址,若改变地址会造成munmap错误。

  9. 映射区访问权限为 “私有”MAP_PRIVATE, 对内存所做的所有修改,只在内存有效,不会反应到物理磁盘上。

  10. 映射区访问权限为 “私有”MAP_PRIVATE, 只需要open文件时,有读权限,用于创建映射区即可。

mmap函数的最基本(常用)调用方式:

1. fd = open("文件名", O_RDWR);2. mmap(NULL, 有效文件大小, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

mmp函数(共享内存映射)使用方法以及注意事项相关推荐

  1. 共享内存映射之mmap()函数详解

    转 共享内存映射之mmap()函数详解 /span> 查看全文 http://www.taodudu.cc/news/show-3175071.html 相关文章: 子集生成(二进制法,逐步生成 ...

  2. mmap函数_Linux内存映射mmap原理分析

    一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了...下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内 ...

  3. 安卓ashmem(匿名共享内存映射)学习native篇

    转自:http://blog.csdn.net/u010657219/article/details/41248965 先看看之前三个进程的关系: 由于这里用到了Binder进程间通信机制,这里再次贴 ...

  4. python remove函数_Python列表的remove方法的注意事项

    为何没有删除列表中的全部元素? 解释: 按照执行顺序,第一个空格被删除之后,后面的元素会前移(变成['空格','空格','12','23']),指针下一次会指向新列表的第二个元素(即初始状态的第三个空 ...

  5. 共享内存 设计原理-shm

    POSIX的shm_open()在/dev/shm/下打开一个文件,用mmap()映射到进程自己的内存地址 System V的shmget()得到一个共享内存对象的id,用shmat()映射到进程自己 ...

  6. 李治军老师操作系统实验6----地址映射与共享-共享内存函数(shmget、shmat、shmctl)

    本文参考https://blog.csdn.net/laoshuyudaohou/article/details/103843023 一.实验目标 深入理解操作系统的段.页式内存管理,深入理解段表.页 ...

  7. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  8. linux如何创建共享内存,linux实现共享内存同步的四种方法

    https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...

  9. Linux系统中消息队列,共享内存、信号和线程的基本操作使用方法

    Linux系统中消息队列,共享内存.信号和线程高级操作 第十一章 消息队列 10.1消息队列定义 10.2 消息队列特点 10.3 key值 10.4 创建消息队列 10.4.1 发送消息 10.4. ...

最新文章

  1. Google提出移动端新SOTA模型MixNets:用混合深度卷积核提升精度
  2. java高级断言_Java之断言
  3. 深入Java虚拟机:JVM中的Stack和Heap
  4. linux虚拟网桥配置nat,使用NAT在Proxmox VE 6上创建专用网桥的方法
  5. android UI自动化测试工具Robotium VS NativeDriver VS Calabash
  6. 11.6 MariaDB安装 11.7/11.8/11.9 Apache安装
  7. Service startService方式的服务
  8. 同行压力(兼谈敏捷团队,绩效管理,自组织团队)
  9. 彻底解决_OBJC_CLASS_$_某文件名“, referenced from:问题(转)
  10. java语言操作Oracle数据库中的CLOB数据类型
  11. HTC 一个基站老无法定位
  12. JAVA并发容器之CopyOnWrite容器
  13. Go 开发关键技术指南 | 带着服务器编程金刚经走进 2020 年
  14. 计算机系统领域顶级会议--OSDI,SOSP
  15. 扫描仪服务器正在运行中,针对使用 Acrobat 时出现的扫描仪问题的故障排除提示...
  16. 暴力破解密码 - C++ 递归方法实现
  17. 易基因|靶基因DNA甲基化测序(Target-BS)
  18. 第六节NoSQL+时序数据库+RabbitMQ安装
  19. 4070显卡相当于什么水平 4070显卡参数 rtx4070显卡功耗
  20. 福州三中 计算机竞赛,福建福州三中喜获信息学竞赛NOIP2020全省人数第1!总计35人获奖...

热门文章

  1. 排序不等式 GCJ 2008 Round1A Problem A. Minimum Scalar Product
  2. 快速提高编程能力——一年时间可以改变很多事
  3. 从零开始学C++之IO流类库(四):输出流格式化(以操纵子方式格式化,以ios类成员函数方式格式化)
  4. 原创:FAT8单片机 Flash文件系统V0.0.1
  5. 几种数据库存储模型的对比
  6. 近年CVPR和ICCV论文下载
  7. RDD Transformation —— sample
  8. 图像处理 | 最常用的边缘检测详解与代码(Robert, Sober, Prewitt, Canny, Kirsch, Laplacian, LOG, DOG算子)
  9. 算法训练 Sticks
  10. HTML和CSS之移动端