linux之文件映射mmap/munmap

1.文件映射,能够将硬盘映射到进程的地址,这样可以向操作内存一样来操作文件,而且效率高;但是有一定的限制,
· 文件的长度必须大于等于映射的长度;
· 映射的offset必须是页(page)的整数倍;

注意:映射不会增长文件的长度;映射部分的内容应该是文件本来就应该有的内容;

2 .文件映射主要使用到两个函数;分别是:mmap和munmap;其函数的原型和所需头文件如下:

 #include 

 void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset); 
 参数:addr通常都指定为NULL,让操作系统来决定在内存空间中开辟映射的空间;
     length:为所映射的长度;
     prot:表示protect,该参数描述了映射的所需内存保护;并且不能与文件的开放模式发生冲突)。
     flags: MAP_SHARED才会将内存体现在硬盘, MAP_PRIVATE不会将数据保存到硬盘
     fd:文件描述符
     offset:从文件的哪部分开始映射

 int munmap(void *addr, size_t length);
 munmap释放内存中分配的映射内存空间;

linux之文件映射mmap/munmap_第1张图片

                  文件映射示意图

3 .在当前的目录下面创建(touch)一个文件1.txt,然后使用命令将其文件空间大小改为“文件映射时候的length”大小;当然这里的length大小可以改变,但是值得注意的是当length改变的时候,文件1.txt文件的大小也得跟着改变,不然执行时候,会出现“段错误”;

改变文件大小方式有两种:

(1) truncate 1.txt --size=4096
也可以采用ftruncate,ftruncate和truncate两个函数的功能都相同,只不过ftruncate函数是通过文件的全路径;而truncate是通过文件描述符来达到目的。

(2) dd if=/dev/zero of= 1.txt bs = 1024 count = 4
/*************************************************************************
    * File Name: mmap.c
    * Author: lixiaogang
    * Mail: [email protected] 
    * Created Time: 2017年06月03日 星期六 20时16分31秒
 ************************************************************************/

#include
#include
#include
#include
#include
#include
#include

int main(int argc,char *argv[])
  {
    int fd = open("1.txt",O_RDWR);
    char buf[] = "hello world.";
    if(fd < 0){
        perror("open");
        return -1;
    }

    size_t length = 4096;
    char *ptr =(char*) mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    if(NULL ==ptr){
        perror("mmap");
        return -1;
    }
    strcpy(ptr,buf);
    munmap(ptr,length);
    close(fd);
/*注意,这里必须得指定文件1.txt的size大小为      *length=4096的大小,不然会出现段错误;
    //因为mmap内存映射不会像文件读写一样,自动地去增长文件空间的大小
    return 0;
  }

打开文件1.txt,此时文件中的内容是

hello world.

4 .若将该代码中的MAP_SHARED改为MAP_PRIVATE,则不会将hello wrold写入1.txt文件中,也就是说不会写入到硬盘里面。

char *ptr =(char*) mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0);

你可能感兴趣的:(Linux应用开发)