UNIX环境变量--存储映射I/O

本文深入解析存储映射I/O的工作原理及其核心函数mmap的使用方法,包括参数解释、常见组合函数munmap、msync及mprotect的作用。通过本文,读者可以了解如何在不使用传统read/write的情况下进行高效文件I/O操作。

 存储映射I/O可以将一个磁盘文件映射到一个存储空间的缓冲区上。于是,在从缓冲区读数据时,相当于读文件,往缓冲区写数据时,相当于写文件。这样就可以在不使用read/write的情况下进行文件I/O。在使用该功能之前,需要告诉内核将一个指定的文件映射到存储区域。

mmap()函数将进程的虚拟地址空间与文件fd建立映射关系,这样进程就可以像访问内存一样,访问文件了。

#include <sys/mman.h>
void* 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()结合一起使用,函数声明如下:

#include<sys/mman.h>

int 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);   /* 解除映射 */
/*进程结束将会解除存储区的映射关系,因为即使文件关闭,并不会解除其映射*/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值