网站大量收购独家精品文档,联系QQ:2885784924

linux下文件映射函数mmap.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux下文件映射函数mmap

HYPERLINK /blog/627321 linux下文件映射函数mmap HYPERLINK /blogs/tag/Linux Linux linux下的mmap函数允许直接把文件映射到内存,对文件的所有操作可以直接使用访问内存一样来操作 因为指定的是文件的地址,所以根据参数可以知道,mmap可以只映射文件的一个片段,而不需要映射整个文件 mmap将整个文件映射到内存,不是地址,而是整个文件的数据都映射到内存,对内存数据的操作都可能对原始文件本身的内容进行同步,通过msync可以保证同步。优点是: 1. 性能更佳,文件数据本来放在磁盘上,现在全部放在内存 2. 操作方便,通过指针直接进行数据的操作,如:(int*) pint = (int*)mmapfile(./a.txt); printf(%d,pint[0]); 3. 进程间数据共享,两个进程对同一个文件进行映射,可以达到进程间数据通讯的目的 mmap所在的头文件 ?????? #include sys/mman.h 函数原型 ?????? void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off); 参数:   start:映射区的开始地址。   length:映射区的长度。   prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起   PROT_EXEC //页内容可以被执行   PROT_READ //页内容可以被读取   PROT_WRITE //页可以被写入   PROT_NONE //页不可访问   flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体   MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。   MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。   MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。   MAP_DENYWRITE //这个标志被忽略。   MAP_EXECUTABLE //同上   MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。   MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。   MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。   MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。   MAP_ANON //MAP_ANONYMOUS的别称,不再被使用。   MAP_FILE //兼容标志,被忽略。   MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。   MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。   MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。   fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为-1。   offset:被映射对象内容的起点。 ? 例子: C代码 ? void?*?mmapfile(const?char*?file)?{ ?? ????????int?filehandle; ?? ????????if?((filehandle?=?open(file,?O_RDWR|?O_CREAT,?S_IRWXU))??0){ ?? ????????????????printf(open?file?wrong!); ?? ????????????????exit(1); ?? ?? ????????}????? ?? ????????struct?stat?file_stat; ?? ????????if?(fstat(filehandle,?file_stat)??0)?{ ?? ????????????????printf(fstat?wrong); ?? ??????????????

文档评论(0)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档