[mmap]系统调用

void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset)
最近在写网络编程项目时用到了这个函数,在这里简单记录一下。

描述:mmap()系统调用把fd文件描述符对象从offset位置开始(字节为单位),映射到以addr为起始地址的页面。

一、参数解释

  • start:映射区的开始地址,一般为空,选址工作交给内核
  • length:映射区的长度
  • prot:期望的内存保护标志, 有以下取值
    * PROT_NONE: 页面不允许访问
    * PROT_READ: 页面可读
    * PROT_WRITE: 页面可写
    * PROT_EXEC: 页面可执行
    通常可写意味着可读,可读意味着可执行,因此不应该完全依赖于flag决定读写模式
  • flags:自定映射对象的类型,映射选项以及对被映射对象的修改是否只对进程可见(copy on write)。
    * MAP_ANONYOUS: 匿名映射,不指定文件名
    * MAP_ANON: 和上一个是同义词
    * MAP_FILE: 从普通文件映射而来(默认选型)
    * MAP_FIXED: 要求addr必须是页面大小的整数倍,如果不是,调用失败。不推荐使用
    * MAP_PRIVATE: 对被映射对象的修改尽进程自己可见(Copy on Write)
    * MAP_SHARED: 修改对其他进程都可见
  • fd:要被映射的文件描述符(可以是普通文件,管道,连接等),一般由open返回, -1表示匿名映射。
  • offset:被映射对象内容的起始地址

二、返回值

一旦调用成功,mmap返回被映射区域的指针,进程可以对这个指针进行读写。根据flags指定的模式,这些读写有可能被其他进程觉察到,由此实现基于共享内存的进程通信。

三、使用mmap用于共享内存的两种方式

  1. 匿名映射:把fd置为-1,指涉特殊文件,flags置为MAP_ANON,适用于具有亲缘关系的进程间通信
  2. 有名映射:fd大于0,指涉普通文件,适用于任何进程间的通信。

四、msync(void* addr, size_t len, int flags)

一般来说,进程对地址空间中共享内容的修改不会立即写入磁盘,而是等待munmap的调用后才执行写磁盘操作,而msync允许我们手工指定同步行为的发生。

五、int munmap(void* addr, size_t len)

解除进程空间某个地址(就是mmap返回的那个地址)和内核某个文件(就是mmap中的那个fd)之间的映射关系。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • UNIX网络编程第二卷进程间通信对mmap函数进行了说明。该函数主要用途有三个:1、将一个普通文件映射到内存中,通...
    宇文黎琴阅读 3,605评论 0 4
  • Linux进程通信实现机制有很多,也有各自优缺点和适用场景,关于她们之间的对比,等各种通信机制一一介绍后,再来一个...
    batbattle阅读 4,158评论 3 13
  • mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址...
    神奇的考拉阅读 2,252评论 3 6
  • 每个人都有脆弱的时候,有些人善于伪装自己,藏好自己的情绪,而有些人就无能为力了,因为那是发自心底的共鸣声,难以控制...
    乐悠悠gf阅读 339评论 1 0
  • 发表于2014年8月16日 平顶山日报 针对新版学生守则删除了“敢于斗争”这一条款,社会各界评论不一。有人认为,这...
    杨心武阅读 254评论 0 0