mmap函数

来源:互联网 发布:seo从入门到精通 编辑:程序博客网 时间:2024/06/09 14:54

  存储映射I/O(memory-mapped I/O)能将一个磁盘文件映射到存储空间中的一个缓冲区上,于是,当从缓冲区中取数据时,就相当于读文件的相应字节。与此类似,将数据存入缓冲区时,相应字节就自动写入文件。这样,就可以在不使用read和write的情况下执行I/O。

  为了实现这个功能,应先告诉内核将一个给定的文件映射到一个存储区域中。这是通过mmap函数实现的。

#include <sys/mman.h>
void* mmap(void* addr,size_t length,int prot,int flag,int fd,off_toff);
返回值:若成功,返回映射区的起始地址;若出错,返回MAP_FAILED

addr参数用于指定映射存储区的起始地址。通常将其设置为0,表示由系统选择该映射区的起始地址。

len参数是映射的字节数。

fd参数是指定要被映射文件的描述符。在文件映射到地址空间之前,必须要先打开该文件。

prot参数是期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问

flag影响映射存储区的各种属性。

MAP_FIXED //返回值必须等于addr。因为这不利于可移植性,所以不鼓励使用此标志,如果未指定此标志,而且addr非0,则内核只把addr视为在何处设置映射区的一种建议。将addr设置为0可获得最大的可移植性。
MAP_SHARED //这一标志描述了本进程对映射区所进行的存储操作的配置。此标志指定存储操作修改映射文件,也就是说,存储操作相当于对该文件的write。必须指定本标志或下一个标志(MAP_PRIVATE),但不能同时指定两者。
MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。

off参数是要映射字节在文件中的起始偏移地址。

0 0
原创粉丝点击