本文共 1093 字,大约阅读时间需要 3 分钟。
存储映射I/O可以将一个磁盘文件映射到一个存储空间的缓冲区上。于是,在从缓冲区读数据时,相当于读文件,往缓冲区写数据时,相当于写文件。这样就可以在不使用read/write的情况下进行文件I/O。在使用该功能之前,需要告诉内核将一个指定的文件映射到存储区域。
mmap()函数将进程的虚拟地址空间与文件fd建立映射关系,这样进程就可以像访问内存一样,访问文件了。
#includevoid* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);/*参数说明如下: start:指定映射存储区的起始地址(并不保证生效),如果为NULL,则表示系统自行选择。 length:存储区的长度 fd:映射文件的文件描述符 offset:映射文件的起始偏移量 prot:指定映射区的读写权限,注意此权限不能高于文件的权限。 取值为(PROT_READ:可读、PROT_WRITE:可写、PORT_EXEC:可执行、PROT_NONE:不可访问) flags:指明存储区的各种属性: MAP_FIXED:若start为非NULL,则映射存储区的起始地址一定是start MAP_SHARE:若对存储区修改相当于对文件修改 MAP_PRIVATE:对存储区修改,将会产生一个副本,即不影响原文件。*/
此外,一般mmap()函数常与munmap()、msync()结合一起使用,函数声明如下:
#includeint mprotect(void* addr,ssize_t len.int port);/*修改存储区权限*/int msync(const void* start,length,int flags);/* 立即将内存修改内容写入文件 *//*flags选项如下,必须指定MS_ASYNC或MS_ASYNC,MS_INVALIDATE为可选项: MS_ASYNC: 请内核尽快将修改写入文件 MS_SYNC : 在此函数返回前,将修改写入到文件 MS_INVALIDATE:通知操作系统丢弃指定范围内的所有页内容*/int munmap(void* start,size_t length); /* 解除映射 *//*进程结束将会解除存储区的映射关系,因为即使文件关闭,并不会解除其映射*/
转载地址:http://iwpub.baihongyu.com/