[mmap]系统调用

作者: 小码弟 | 来源:发表于2018-12-18 16:45 被阅读0次

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)之间的映射关系。

相关文章

网友评论

    本文标题:[mmap]系统调用

    本文链接:https://www.haomeiwen.com/subject/ukylkqtx.html