#include <sys/mman.h>

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

int munmap(void *addr, size_t length);

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

返回:成功,返回创建的映射区首地址(其返回的地址可以作为数组的首地址来使用);失败,返回MAP_FAILED(宏)。

addr:建立映射区的首地址,由Linux内核指定。使用时,直接传递NULL

length:欲创建映射区的大小(必须小于文件大小);

prot:映射区权限PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE(两个宏位或);

flags:标志位参数(常用于设定更新物理区域、设置共享、创建匿名映射区),MAP_SHARED:会将映射区所做的操作反映到物理设备(磁盘)上,MAP_PRIVATE:映射区所做的修改不会反映到物理设备;

fd:用来建立映射区的文件描述符

offset:映射文件的偏移4k的整数倍),即只是映射文件的部分,不是从开始处映射。

int munmap(void *addr, size_t length);

同malloc(new)函数申请内存空间类似的,mmap建立的映射区在使用结束后也应调用类似free(delete)的函数来释放。

addr:映射区的首地址   length:映射区的长度

成功:0,失败:-1

两个函数的注意事项:

1.创建映射区的过程中,隐含着一次对映射文件的读操作,因此在打开文件时必须包括读权限,才能创建映射区;

2.当MAP_SHARED时,要求:映射区的权限应 <=文件打开的权限(出于对文件的保护)。而MAP_PRIVATE则无所谓,因为mmap中的权限是对内存的限制;

3.映射区的释放与文件关闭无关。只要映射建立成功,文件可以立即关闭。在建立好映射区之后就可以关闭文件了,以后在对映射区的读写操作不再需要文件描述符了,因为映射关系已经被mmap系统调用确定了。

4.特别注意,当映射文件大小为0时,不能创建映射区。所以:用于映射的文件必须要有实际大小!不能为0mmap使用时常常会出现总线错误,通常是由于共享文件存储空间大小引起的。malloc(或new)分配的地址大小(堆空间)都可以指定为0(使用完后,需要free(或delete)释放),但是mmap不可以!!

5.munmap传入的地址一定是mmap的返回地址,坚决杜绝指针++操作(必须完全对应);

6.文件偏移量必须为4K的整数倍,因为MMU完成了从线性地址到物理地址的映射,映射时以页为单位进行的,一页一页进行映射;

7.mmap创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。

因此,对于新创建的文件,必须对文件进行拓展(ftruncate、truncate和lseek),然后才能创建映射区。对于lseek、mmap等函数的指针移动都是以字节为单位的(char为1个字节)。

mmap、munmap函数相关推荐

  1. mmap/munmap函数详解

    [ mmap/munmap系统调用]        功能描述: mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.m ...

  2. linux 高级IO函数之fcntl mmap/munmap

    fcntl函数提供了对文件描述符的各种控制操作.另外一个常见的控制文件描述符属性和行为的系统调用是ioctl,而且ioctl比fcntl能够执行更多的控制.但是对于控制文件描述符常用的属性和行为,fc ...

  3. mmap函数和munmap函数

    mmap函数和munmap函数 mmap函数用于申请一段内存空间,我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射到其中.munmap函数则用于释放有mmap创建的这段内存空间.他们的 ...

  4. Linux中mmap与munmap函数系统调用

    内存映射函数mmap, 负责把文件内容或者其他对象映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作.文件或者其他对象被映射到多 ...

  5. linux进程的通信文件映射,Linux进程间通信 -- mmap函数的使用

    mmap/munmap函数 函数原型 #include void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t ...

  6. 计算机科学精彩帖子收集

    linux源码 LXR 源自"the Linux Cross Referencer",中间的"X"形象地代表了"Cross".与 Sourc ...

  7. Unix/Linux环境C编程入门教程(27) 内存那些事儿

    calloc() free() getpagesize() malloc() mmap() munmap()函数介绍 calloc(配置内存空间) 相关函数 malloc,free,realloc,b ...

  8. Linux内存管理宏观篇(七)虚拟内存

    Linux内存管理宏观篇(七)虚拟内存 前面知道了物理内存,物理内存是实打实的,我只有这么多,用的时候你只能用这么多. 为了解决一些问题,产生虚拟内存,通过虚拟内存可以让我们每个进程都能拥有虚拟的3G ...

  9. linux 堆利用基础知识

    ptmalloc2 是目前 Linux 标准发行版中使用的堆分配器. 内存分配基本思想 堆管理器负责向操作系统申请内存,然后将其返回给用户程序,但是频繁的系统调用会造成大量的开销.为了保持内存管理的高 ...

最新文章

  1. Android之组件化开发
  2. css sprite技巧详解
  3. 我用 PyTorch 复现了 LeNet-5 神经网络(自定义数据集篇)!
  4. 通过flask构建自己的代理池
  5. django实战——常见web攻击与防范
  6. 78. Subsets 1
  7. OpenCV(二)---朴素贝叶斯分类器 NormalBayesClassifier
  8. 威伦触摸屏脚本,宏指令
  9. 百度翻译反向js——破解反爬虫
  10. 使用低代码开发的图书管理系统如何使用扫条形码实现图书的录入?
  11. 深度评测阿里云、腾讯云和华为云
  12. 如何将JPG转换成PNG格式呢?
  13. 国内十大活跃报表 BI 产品深度对比及点评
  14. 如何把本机的文件共享到VMware虚拟机
  15. 思科下一代模拟器EVE-NG安装
  16. 透明遮罩图层VS高斯模糊滤镜 效果分析
  17. BIND+Mysql实现DNS轮询泛解析和IP视图
  18. 巧推网站seo优化推动网站快速排名
  19. virtio网络Data Plane卸载原理——vhost protocol
  20. 微信 图片二维码识别不了的问题

热门文章

  1. 九度OJ1486 /POJ 1029/2012北京大学研究生复试上机
  2. Solution 19: Fibonacci数列
  3. 多线程之间共享数据的实现
  4. c语言sqlist结构体,c语言里 sqlist
  5. php 四维数组_PHP 多维数组
  6. 复旦大学计算机学院博士生王斌,复旦大学计算机科学技术学院博士生刘鹏飞荣获...
  7. 用java单源最短路径问题_单源最短路径-贪心算法
  8. 华为鸿蒙不再孤,华为鸿蒙OS系统不再孤单!又一款国产系统启动内测:再掀国产替代化...
  9. 洛谷P1014 [NOIP1999 普及组] Cantor 表
  10. 【C++基础】模板基础与函数模板