[mmap]系统调用
2018-12-18 本文已影响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用于共享内存的两种方式
- 匿名映射:把fd置为-1,指涉特殊文件,flags置为MAP_ANON,适用于具有亲缘关系的进程间通信
- 有名映射:fd大于0,指涉普通文件,适用于任何进程间的通信。
四、msync(void* addr, size_t len, int flags)
一般来说,进程对地址空间中共享内容的修改不会立即写入磁盘,而是等待munmap
的调用后才执行写磁盘操作,而msync
允许我们手工指定同步行为的发生。
五、int munmap(void* addr, size_t len)
解除进程空间某个地址(就是mmap返回的那个地址)和内核某个文件(就是mmap中的那个fd)之间的映射关系。