原文地址:http://www.cnblogs.com/feisky/archive/2009/11/11/1600986.html

Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明:

  • 头文件:

    • <unistd.h>
    • <sys/mman.h>
  • 原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);
  • 返回值: 成功则返回映射区起始地址, 失败则返回MAP_FAILED(-1).
  • 参数:
    • addr: 指定映射的起始地址, 通常设为NULL, 由系统指定.
    • length: 将文件的多大长度映射到内存.
    • prot: 映射区的保护方式, 可以是:
      • PROT_EXEC: 映射区可被执行.
      • PROT_READ: 映射区可被读取.
      • PROT_WRITE: 映射区可被写入.
      • PROT_NONE: 映射区不能存取.
    • flags: 映射区的特性, 可以是:
      • MAP_SHARED: 对映射区域的写入数据会复制回文件, 且允许其他映射该文件的进程共享.
      • MAP_PRIVATE: 对映射区域的写入操作会产生一个映射的复制(copy-on-write), 对此区域所做的修改不会写回原文件.
      • 此外还有其他几个flags不很常用, 具体查看linux C函数说明.
    • fd: 由open返回的文件描述符, 代表要映射的文件.
    • offset: 以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射.

下面说一下内存映射的步骤:

  • 用open系统调用打开文件, 并返回描述符fd.
  • 用mmap建立内存映射, 并返回映射首地址指针start.
  • 对映射(文件)进行各种操作, 显示(printf), 修改(sprintf).
  • 用munmap(void *start, size_t lenght)关闭内存映射.
  • 用close系统调用关闭文件fd.

注意事项:

在修改映射的文件时, 只能在原长度上修改, 不能增加文件长度, 因为内存是已经分配好的.

转载于:https://www.cnblogs.com/wangkangluo1/archive/2011/07/23/2114655.html

Linux mmap相关推荐

  1. Linux mmap 详解

    Linux mmap详解 一.mmap()是什么 二.mmap()原理 三.mmap和常规文件操作的区别 四.mmap相关函数 五.mmap使用细节 六.对mmap()返回地址的访问 例子: 情形一: ...

  2. Linux mmap内存映射

    将最近网上搜索的资料统一整理下,方便后续复查. 一.什么是mmap mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一 ...

  3. Linux mmap原理

    Linux mmap原理 前言 Linux段页式内存管理 mmap mmap内存映射原理 文字概述 mmap函数参数介绍 源码解析 1. 文件映射 2. 缺页异常 mmap 和常规文件操作的区别 mm ...

  4. linux mmap内存文件映射

    一.传统文件访问 unix访问文件的传统方法使用open打开他们,如果有多个进程访问一个文件,则每一个进程在再记得地址空间都包含有该文件的副本,这不必要地浪费了存储空间.下面说明了两个进程同时读一个文 ...

  5. linux+mmap父子通信_linux库函数mmap()原理?转载

    linux库函数mmap()原理 转载 1.mmap基本概念 2.mmap内存映射原理 3.mmap和常规文件操作的区别 4.mmap优点总结 5.mmap相关函数 6.mmap使用细节 7.mmap ...

  6. linux mmap 内存映射

    http://www.perfgeeks.com/?p=723 mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap ...

  7. linux文件 内存映射 锁,linux – mmap:将映射文件立即加载到内存中吗?

    不,是的,也许吧.这取决于. 调用mmap通常只意味着对应用程序而言,映射文件的内容将映射到其地址空间,就像文件已加载到那里一样.或者,好像该文件确实存在于内存中,就好像它们是同一个(包括更改被写回磁 ...

  8. linux mmap 内存映射 mmap() vs read()/write()/lseek()

    From: http://www.perfgeeks.com/?p=723 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进 ...

  9. linux mmap系统调用

    brk/mmap linux 提供了两个比较重要的系统调用brk 和mmap,用于向内核申请相应用户空间,内核会根据系统运行状态判定是否申请新的VMA来管理新申请的用户空间,brk和mmap在整个系统 ...

最新文章

  1. swift_023(Swift 的继承)
  2. AfxBeginThread
  3. ConcurrentHashMap的源码分析-put方法第四阶段
  4. tyvj 1391 走廊泼水节【最小生成树】By cellur925
  5. 经典的 div + css 鼠标 hover 下拉菜单
  6. 图解+笔记-4.2.1 字符串获取操作、字符串合并和重复操作
  7. SQL Server 2005 性能优化实战系列(文章索引)
  8. vue2.0+ajax封装,vue2 封装 ajax插件
  9. FCKEditor v2.6.3 最新版-ASP.NET 演示程序
  10. python求圆的面积pta_任意给定一个正实数,设计一个算法求以这个数为半径的圆的面积...
  11. 解决相片上传主键唯一性问题,java 上传相片到服务器的时候,相片保存主键用guid。...
  12. 在ubuntu上定时锁屏
  13. Java,List转json,json转List
  14. Maxwell 是什么?
  15. AI产品经理的技术了解层级
  16. python tkinter窗口组件Canva
  17. 人工智能--不确定性推理概述
  18. Vue中实现页面截图并上传
  19. 复杂网络作业四:第三题——随机图、小世界网络和真实网络的度分布
  20. 什么是 cisco ios

热门文章

  1. [转]JQuery.Ajax之错误调试帮助信息
  2. 删除Windows Service
  3. Python中map()函数浅析
  4. 以实例让你真正明白mapreduce---填空式、分布(分割)编程
  5. Visual C++利用互斥量同步线程实现文件读取进度条
  6. 产品经理经验谈100篇(八)-产品经理分析框架解析
  7. 火狐配置java_java selenium+firefox环境搭建
  8. win7 网络端口怎么设置_教你win7如何设置网络共享文件夹
  9. Bash脚本教程之基本语法
  10. mysql加上判断_在mysql中where加if判断