1、mmap函数是一个比较神奇的函数,它可以把文件映射到进程的虚拟内存空间。通过对这段内存的读取和修改,可以实现对文件的读取和修改,而不需要用read和write函数。如下图所示,为mmap实现原理的示意图。

在这个图中,off为映射的部分在文件中的偏移量,len为映射的长度。

2、下面我们来看一下mmap函数的原型

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

在这个函数原型中:

参数addr:指定映射的起始地址,通常设为NULL,由内核来分配

参数length:代表将文件中映射到内存的部分的长度。

参数prot:映射区域的保护方式。可以为以下几种方式的组合:

PROT_EXEC 映射区域可被执行
PROT_READ 映射区域可被读取
PROT_WRITE 映射区域可被写入
PROT_NONE 映射区域不能存取

参数flags:映射区的特性标志位,常用的两个选项是:

MAP_SHARD:写入映射区的数据会复制回文件,且运行其他映射文件的进程共享

MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制,对此区域的修改不会写会原文件

参数fd:要映射到内存中的文件描述符,有open函数打开文件时返回的值。

参数offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。

函数返回值:实际分配的内存的起始地址。

3、munmap函数

与mmap函数成对使用的是munmap函数,它是用来解除映射的函数,原型如下:

int munmap(void *start, size_t length)

在这个函数中,

参数start:映射的起始地址

参数length:文件中映射到内存的部分的长度

返回值:解除成功返回0,失败返回-1。

4、实例分析

  下面是一个mmap使用的实例代码

 //打开文件fd = open("testdata",O_RDWR);//创建mmapstart = (char *)mmap(NULL,128,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//读取文件   strcpy(buf,start);printf("%s\n",buf);//写入文件strcpy(start,"Write to file!\n");munmap(start,128);close(fd);

这段代码实现了将测试文件testdata打开,并用mmap函数将文件映射到虚拟内存中,通过指针start对文件进行读写。在终端中可看到由文件读取的数据。程序结束后,可以查看testdata文件,来查看写入的数据。

  程序的源码可以从本文的资源中下载。

mmap函数的用法详解及实例分析相关推荐

  1. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  2. java super实例_java Super 用法详解及实例代码

    java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java  Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...

  3. matlab 调整灰度,matlab灰度图像调整及imadjust函数的用法详解

    matlab--imadjust函数作用: 对进行图像的灰度变换,即调节灰度图像的亮度或彩色图像的颜色矩阵 在MATLAB中,通过函数imadjust()进行图像灰度的调整,该函数调用格式如下: J= ...

  4. C++中const关键字用法详解及实例和源码下载(一)

    最近在学习C++基础部分,看了两天书,已经看过了一遍,半知半解,回过头来重新看第二遍,深入了解一下C++的基础知识.现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲 ...

  5. python decode函数的用法_Oracle DECODE函数的用法详解

    Oracle DECODE函数 使用方法: 1.比较大小 select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值 sign()函数根据某个值 ...

  6. matlab对图像进行gamma变换_matlab灰度图像调整及imadjust函数的用法详解

    matlab--imadjust函数作用: 对进行图像的灰度变换,即调节灰度图像的亮度或彩色图像的颜色矩阵 在MATLAB中,通过函数imadjust()进行图像灰度的调整,该函数调用格式如下: J= ...

  7. php函数find的用法,c语言find函数的用法详解

    c语言find函数的用法详解 C语言之find()函数 find函数用于查找数组中的某一个指定元素的位置. 比如:有一个数组[0, 0, 5, 4, 4]: 问:元素5的在什么位置,find函数 返回 ...

  8. java string()函数_转载java String.split()函数的用法详解

    转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...

  9. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

最新文章

  1. 每个公司都会用的短 URL 服务,怎么设计与实现?
  2. seaborn常用图
  3. java里的关键字有什么用_java语言关键字有哪些?都有什么用处?
  4. Serverless实战之路
  5. 阿里健康研究院:仅17%人群拥有高质量睡眠 4成95后00后天天熬夜
  6. 调整步长支持跨数据库的ID唯一性弊端
  7. 5开发 时间格式化_2020年,前端开发者必备的10个VS Code扩展插件
  8. Android现学现用第十二天
  9. 11月22日学习内容整理:bootstrap居中处理和组件,常用组件
  10. 上班按小时的怎么记,小时工计时怎么用便签记上个月的工时
  11. mysql 分页 conut优化_mysql count函数与分页功能极限优化
  12. 【03】手把手教你构建垃圾分类系统-基于tensorflow2.3
  13. 【历史上的今天】9 月 20 日:中国正式接触互联网;抖音上线;中科大成立
  14. Python实现对文件内容进行加密
  15. 润物无声因挚爱,育人无痕待花开
  16. 【Linux编译器】
  17. mac微信备份位置macos手机微信备份的文件迁移走
  18. pandas与数据库
  19. SEO优化考核的七大指标
  20. linux网卡断流测试,RouterOS断流解决办法探讨

热门文章

  1. 怎么把一张暗的照片调亮_照片太暗怎么处理?教你使用美图秀秀提高照片亮度...
  2. CAD利用Excel快速绘制多段线
  3. 手机视频去水印哪个好
  4. linux下载测序数据,利用SRA号从NCBI下载测序原始数据
  5. 基于python的Tkinter模块和Threading模块制作的用于班级/多人抽签的小程序
  6. android女手机弹唱take a bow,黑科技!不会乐器也能钢琴弹唱,手机上就能练习,你应该知道...
  7. java biginteger位数_JAVA 大数(BigInteger) 归纳总结
  8. Promethus(普罗米修斯)
  9. java 书籍借阅 问题_关于图书借阅系统的问题
  10. 【Javaweb】静态资源style.css加载不出来