正在加载……
专注、离线、切勿分心

MMAP文件映射(文件内存映射)

       ——大文件操作,防止频繁读,效率低,所以映射到内存。映射到内存,再次操作文件就相当于操作内存,效率很高,操作完解除映射,文件也相应改变了;



mmap 将一个文件或者其它对象(主要指设备)映射进内存。文件被映射到多个页上(每页4K),如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零;mmap在用户空间映射调用系统中作用很大。

#include<sys/mman.h>

void* mmap(void* start,     size_t  length,    int  prot,    int   flags,    int  fd,    off_t  offset);        //失败返回(char*)-1

int  munmap(void*  start,  size_t length);         //解除内存映射:用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。

成功执行时,mmap()返回被映射区的指针munmap()返回0。失败时,mmap()返回MAP_FAILED,其值为(void *)-1,munmap返回-1


start:映射区的开始地址,设置为NULL时表示由系统决定映射区的起始地址。

length:映射区的长度。//长度单位是 以字节为单位,不足一内存页按一内存页处理(常用映射文件大小

prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起

PROT_EXEC //页内容可以被执行

PROT_READ //页内容可以被读取

PROT_WRITE //页可以被写入

PROT_NONE //页不可访问

flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个的组合体 (常用MAP_SHARED

fd:有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射

off_toffset:被映射对象内容的起点。(相对于内存映射页的偏移)(常用0

prot:   PROT_READ|PROT_WRITE  (页内容可读可写)

flags:  MAP_SHARED  (与其他所有映射这个对象的进程共享映射空间)


openmode:  RDWR

test.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<sys/mman.h>
#include<string.h>
int main(int argc,char **argv)
{
     int fd = open(argv[1],O_RDWR);
     struct stat buf;
     bzero(&buf,sizeof(struct stat));
     fstat(fd,&buf);
     char *p = (char *)mmap(NULL,buf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
     printf("p=%s\n",p);
     char tmp[5]="world";
     for(int i=0;i<strlen(tmp);i++)
     {
             p[i]=tmp[i];
     }
     printf("------after change------\n%s\n",p);
     munmap(NULL,buf.st_size);
     return 0;
}

mmap

1、文件必须有大小,映射后不能改变文件大小

2、让系统帮我们选择起始地址,第一个参数问NULL

3、用完后要解除映射munmap


#include<unistd.h>
#include<sys/mman.h>
int munmap(void *start,size_t length);   //接触映射;解除映射成功则返回0,否则返回-1

函数说明:
munmap()用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述符时不会解除映射。



posted on 2018-02-12 11:08  正在加载……  阅读(727)  评论(0编辑  收藏  举报