存储映射I/O

存储映射IO使得一个磁盘文件和缓冲区的一个空间相映射,从缓冲区取数据时就表示从文件中读数据,向缓冲区写数据就表示写数据到文件;
这样就可以在不使用read和write的情况下执行IO操作;epoll函数便是使用这种技术,提高了描述符状态的传送速度;
形式为:mmap(void* addr,size_t  len,int  prot,int  flag,int  filedes,off_t  off)
共6个参数;
第一个参数表示从映射到存储空间的哪个地址,通常设置为0;
第二个参数表示要映射的字节数;
第四个参数指定存储区的属性;一般使用MAP_SHARED属性;可选的有MAP_FIXED,MAP_PRIVATE 和 MAP_SHARED;
第五个参数表示要映射的文件描述符,映射之前要先打开该文件描述符;
第六个参数表示从文件的哪个起始地址开始映射到缓冲区中;

第三个参数表示对缓冲区的保护限制;不能超过文件open时所指定的权限;

存储映射文件的示意图:

解除映射:
可以调用munmap函数来解除映射(关闭描述符并不解除映射关系,同时调用munmap也不会使映射区的内容冲刷到文件中):
munmap(caddr_t  addr ,size_t   len);
其中caddr_t数据结构为:    typedef   void*   caddr_t  ; //  void * 只是定义了一个指针,可以是指向任何数据类型的指针。

注意:
当指定存储区属性为MAP_FIXED 时,addr和off通常应是系统虚存页长度的倍数;另外因为映射文件的起始偏移量受到系统虚存页长度的限制,那么如果长度不是虚存页长度的倍数,将如何?
假定文件长度为12字节,系统页长尾512字节,那么系统会提供512字节的映射区,其中后500字节被设置为0,可以修改这500字节,但是任何变动都不会在文件中反映出来,所以我们就不能通过map来修改文件。为了修改文件,我们必须加长文件,然后再通过mmap对其进行修改;如果在映射区中的页已经被修改,那么可以调用msync函数将该页冲洗到被映射的文件中,msync类似于fsync,但是只作用域存储映射区;



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值