(1)作用:将磁盘文件的数据映射内存,用户通过修改内存就能修改磁盘文件。
(2)函数原型:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

(3)参数:共 6 个(前 4 个修饰映射区,后 2 个修饰磁盘文件),分别为:
1)映射区首地址(addr): 我们不知道首地址,传 NULL(但内核知道),但我们可以通过返回值获取。
2)映射区的大小(length): 不能为 0 (一般写文件大小,但实际会扩充至 4k 的整数倍)。
3)映射区的权限(prot): PROT_READ 读权限 ;PROT_WRITE 写权限 (注意:必须要有读权限)。
4)标志位参数(flags): MAP_SHARED 共享的 MAP_PRIVATE 私有的(注意:这个参数关系到内存数据是否会同步到磁盘文件)。
5)文件描述符(fd): 怎么得到 fd? 先 open 获得 (注意:必须包含读权限)。
6)文件的偏移量(offset):注意必须是 4k 的整数倍,一般不偏移(写 0)。
(4)返回值:
调用成功:返回映射区的首地址(viod*)。
调用失败:返回一个 -1 的宏 。
(5)释放内存映射区 munmap:
函数原型:

int munmap(void *addr, size_t length)

释放成功返回 0, 释放失败返回 -1。

关于 mmap 有几点注意:
(1)如果对映射区的首地址(创建 mmap 的返回值)进行 mem++,munmap 可不能释放成功。
(2) 如果 open 时 O_RDONLY, mmap 时 PROT 参数指定 PROT_READ | PROT_WRITE 则mmap会调用失败。
(3)如果文件偏移量为 1000 则 mmap 也会调用失败,因为参数是无效的。偏移量必须是 4096 的整数倍。
(4)一定要检测 mmap 的返回值,因为mmap 的坑很多,如果调用失败,基本不知道失败原因。
(5) mmap 在如下情况下会调用失败:
参数 2 length = 0
参数 3 没有指定 PROT_READ
参数 4 要考虑是否同步磁盘
参数 5 fd 打开权限小于映射区权限
参数 6 偏移量不是 4096 整数倍
(6)不能 open 的时候 O_CREAT 一个新文件来创建映射区吗,因为创建一个新文件,文件大小为 0,会出现总线错误,若要创建,则创建后要扩展 ftruncate(fd, length)。
(7)文件描述符先关闭,对 mmap 映射没有影响,只要通过 mmap 建立起磁盘文件和内存映射区的关系后,文件描述符就没有用了。
(8)对 mem 越界操作,如果越界的内存被其他资源占用,会出现段错误。
(9)创建映射区的过程中,隐含着一次对映射文件的读操作。 打开文件 open 一定要包含读权限。
(10)对于 MAP_SHARED,要求:“文件打开的权限”小于等于“映射区的权限”;对于 MAP_PRIVATE 则无所谓,因为 mmap 中的权限是对内存的限制。。
(11) 映射区的释放与文件关闭无关。只要映射建立成功,文件可以立即关闭。。
(12)特别注意,当映射文件大小为 0 时,不能创建映射区。
所以:用于映射的文件必须要有实际大小!!(truncate)。
(13)mmap 使用时常常会出现总线错误,通常是由于共享文件存储空间没有对齐引起的。。
(14)munmap 传入的地址一定是 mmap 的返回地址。坚决杜绝指针移动操作,否则会释放失败。。
(15) 文件偏移量必须为 4k 的整数倍。
(16) mmap 创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。

Linux学习之系统编程篇:mmap 内存映射区相关推荐

  1. Linux学习之系统编程篇:mmap练习

    一.利用 mmap 读取磁盘文件内容 // 需求:将文件传入内存映射区,然后输出至屏幕 #include <stdio.h> #include <unistd.h> #incl ...

  2. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式

    一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...

  3. Linux学习之系统编程篇:对线程的基本认识

    (1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢? fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthre ...

  4. Linux学习之系统编程篇:IPC 和管道的基本概念及管道的创建

    一.IPC 概念 IPC: 进程间通信. 进程间通信的常见的 4 中方式: (1)管道 pipe fifo :最简单(但只能在有血缘关系下进行). (2)信号 signal : 属于系统的,所以系统开 ...

  5. Linux学习之系统编程篇:创建匿名映射区(只适用于有血缘关系)

    在之前的文章中我们讲过创建"有名映射区":即创建之前一定要先打开文件. 本处是不需要先创建文件. 方法:与创建"有名映射区"相比 第2参数(映射区长度):因为这 ...

  6. Linux学习之系统编程篇:shm 共享内存及其操作函数

    一.shm 和 mmap 的区别 (1)mmap 是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射.shm 每个进程最终会映射到同一块物理内存.shm 保存在物理内存,这样读写的速度最 ...

  7. Linux学习之系统编程篇:MMU(Memory Manager Unit 内存管理单元)

    一.虚拟内存地址 对应于上图的两端,其中 0 - 3G 是用户区 ,3 - 4G 是内核区.编码的内存地址都是虚拟地址. 在3G到4G之间是PCB 进程控制块.从3G到0依次为: (1)命令行参数 和 ...

  8. Linux学习之系统编程篇:读写锁(pthread_ rwlock _init / rdlock / wrlock / unlock / destroy)

    一.读写锁的认识 (1)读写锁是1把锁. (2)读写锁的类型: pthread_rwlock_t lock 又分"读锁"(不让读内存)和"写锁"(不让写内存) ...

  9. Linux学习之系统编程篇:互斥锁(pthread_mutex_init / lock / trylock / unlock / destroy)

    一.主要函数介绍 (1)定义锁 : pthread_mutex_t mutex; //互斥锁 数据类pthread_mutex_t (2)初始化锁: int pthread_mutex_init(pt ...

最新文章

  1. 为了上班摸鱼,我用Python开发“BOSS来了”
  2. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程
  3. Python的介绍与安装
  4. 华为的研发给我们什么启示?
  5. Linux中默认的JDK版本设置
  6. python列表逐行写入excel_python表格数据到excel-想问下python3怎么将列表数据逐行写入excel表格呢?...
  7. 她小时候被指没数学天分,后来竟成为首位获数学大奖的女人;她的生命很短暂却惊艳了全世界...
  8. 安装ps时无法验证订阅状态_关于宝马B38/B48发动机无法启动的技术通报
  9. Ant :Property
  10. hive 常用函数操作
  11. 计算机无法识别sd存储卡,Win7系统电脑插入SD卡提示“无法读取SD卡”的解决方法...
  12. 7-3 IP地址转换
  13. 在机器学习领域,主要的学习方式是哪几种?
  14. QIL:《Learning to Quantize Deep Networks by Optimizing Quantization Intervals with Task Loss》论文学习
  15. java实验报告之applet(小程序)
  16. (三)基于Multisim的电台发射系统:高频功率放大器的设计
  17. W5300E01-ARM用户手册版本1.0(二)
  18. Xilinx AC701评估板——PLL配置实例
  19. 20194311姜晨昊Exp6-MSF应用基础
  20. 2023新华为OD机试题 - 相同数字的积木游戏 1(JavaScript)

热门文章

  1. 多样性文本生成任务的研究进展
  2. 将图卷积神经网络用于解码分子生成
  3. L2正则没有想象那么好?可能是“权重尺度偏移”惹的祸
  4. 阿里巴巴虾米的机器学习与深度学习进阶记
  5. 机器阅读理解 / 知识库 / 深度学习 / 对话系统 / 神经机器翻译 | 本周值得读
  6. 直播实录 | AlphaGo Zero是如何实现无师自通的?
  7. java中文 x_java环境url中文参数乱码处理
  8. ClickHouse【资源分享 01】Linux环境 clickhouse-19.7.3.9 离线安装文件分享(百度云盘)
  9. rog live service是什么_王者荣耀五周年好礼送不停,玩游戏还能白嫖ROG游戏手机3?...
  10. NAS——在VMware 15虚拟机中安装黑群晖DSM解决方案