mmap 应用

unix提供了一个非常有用的功能,它允许程序共享内存,linux内核从2.0版本开始已经把这一功能包括进来。mmap(内存映射,memory map)函数的作用是建立一段内存,使它能够被两个或更多个程序读写。一个程序对它所做出的修改可以被其他程序看见。
这一功能还可以用在文件的处理上。你可以使某个磁盘文件的全部内容看起来就像是内存中的一个数组。如果文件由记录组成,而这些记录又能够用c语言中的结构来描述的话,你就可以通过访问结构数组对文件的内容进行修改。
这要通过使用带特殊权限集的虚拟内存段才能实现。对这类虚拟内存段的读写会使操作系统去读
写磁盘文件中与之对应的部分。
mmap函数创建一个指向一段内存区域的指针,该指针将与文件的内容相关联,而文件则是通过一个打开的文件描述符来访问。
#include
void *mmap(void *addr, size_t len, int prot, int flags,
int fildes, off_t off);
你可以通过传递off参数来改变经共享内存段访问的文件中数据的起始偏移值。打开的文件描述符由fildes参数给出。可以访问的数据量(即内存段的长度)由len参数设置。
你可以通过addr参数请求使用某个特定的内存地址。如果它的取值是零,结果指针将将自动分配。这是推荐的做法,否则会降低程序的可移植性,因为不同系统上的可用地址范围是不一样的。
prot参数用来设置内存段的访问权限。它是下列常数值的按位or结果:
? port_read:允许读该内存段。
? port_write:允许写该内存段。
? port_exec:允许执行该内存段。
? port_none:该内存段不能被访问。
flags参数控制程序对该内存段的改变所造成的影响,如表3-7所示。
表 3-7
map_private 内存段是私用的,对它的修改只在此局部范围内有效
map_shared 把对该内存段的修改保存到磁盘文件中
map_fixed 该内存段必须位于addr指定的地址处
msync函数的作用是把在该内存段的某个部分或整段中的修改写回到被映射的文件中(或者从被映射文件里读出)。
#include
int msync(void *addr, size_t len, int
flags);
内存段需要修改的部分由作为参数传递过来的起始地址addr和长度len确定。flags参数控制着执行修改的具体方式,如表3-8所示。
表 3-8
ms_async 采用异步写方式
ms_sync 采用同步写方式
ms_invalidate 从文件中读回数据
munmap函数的作用是释放内存段:
#include
int munmap(void *addr, size_t len);
下面的程序mmap_eg.c演示了如何利用mmap和数组方式的存取操作对结构化数据文件进行修改。注意,2.0版本之前的linux内核不完全支持mmap的这种用法。这个程序在sun solaris和其他操作系统上也能够正确运行。
实验:使用mmap函数(暂略)
<script type="text/javascript" id="wumiiRelatedItems"> </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值