linux下文件映射函数mmap

linux下文件映射函数mmap

ID:1990032

大小:24.30 KB

页数:3页

时间:2017-11-14

linux下文件映射函数mmap_第1页
linux下文件映射函数mmap_第2页
linux下文件映射函数mmap_第3页
资源描述:

《linux下文件映射函数mmap》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、linux下文件映射函数mmapLinuxlinux下的mmap函数允许直接把文件映射到内存,对文件的所有操作可以直接使用访问内存一样来操作因为指定的是文件的地址,所以根据参数可以知道,mmap可以只映射文件的一个片段,而不需要映射整个文件mmap将整个文件映射到内存,不是地址,而是整个文件的数据都映射到内存,对内存数据的操作都可能对原始文件本身的内容进行同步,通过msync可以保证同步。优点是:1.性能更佳,文件数据本来放在磁盘上,现在全部放在内存2.操作方便,通过指针直接进行数据的操作,如:(int*)pint=(int*)mmapfile("./a.txt");printf(

2、"%d",pint[0]);3.进程间数据共享,两个进程对同一个文件进行映射,可以达到进程间数据通讯的目的mmap所在的头文件      #include函数原型      void*mmap(void*addr,size_tlen,intprot,intflags,intfildes,off_toff);参数:  start:映射区的开始地址。  length:映射区的长度。  prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起  PROT_EXEC//页内容可以被执行  PROT_READ//页内容可

3、以被读取  PROT_WRITE//页可以被写入  PROT_NONE//页不可访问  flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体  MAP_FIXED//使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。  MAP_SHARED//与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。  MAP_PRIVAT

4、E//建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。  MAP_DENYWRITE//这个标志被忽略。  MAP_EXECUTABLE//同上  MAP_NORESERVE//不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。  MAP_LOCKED//锁定映射区的页面,从而防止页面被交换出内存。  MAP_GROWSDOWN//用于堆栈,告诉内核VM系统,映射区可以向下扩展。  MAP_ANONYMOUS//匿名映射,映射区不与

5、任何文件关联。  MAP_ANON//MAP_ANONYMOUS的别称,不再被使用。  MAP_FILE//兼容标志,被忽略。  MAP_32BIT//将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。  MAP_POPULATE//为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。  MAP_NONBLOCK//仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。  fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为

6、-1。  offset:被映射对象内容的起点。 例子:C代码 1.void * mmapfile(const char* file) {  2.        int filehandle;  3.        if ((filehandle = open(file, O_RDWR

7、 O_CREAT, S_IRWXU)) < 0){  4.                printf("open file wrong!");  5.                exit(1);  6.  7.        }       8.        struct stat file_

8、stat;  9.        if (fstat(filehandle, &file_stat) < 0) {  10.                printf("fstat wrong");  11.                exit(1);  12.        }   13.  14.        printf("%s file size:%d", file, file_stat.st_size);  15.        void* sf

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。