使用 mmap 将磁盘文件映射到存储空间

mmap

#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

(读作 my map)

使用 mmap 可以将磁盘上的文件映射到用户的虚拟地址空间中

其首地址可以通过函数 mmap 的返回值获取

addr 一般设置成 0,表示由系统选取映射区的首地址

length 一般设置成文件的长度,代表将整个文件映射到虚拟空间中

prot 有如下值

● PROT_EXEC  映射区可执行

● PROT_READ  映射区可读

● PROT_WRITE  映射区可写

● PROT_NOE  映射区不可访问

flags 一般设置成如下值

● MAP_SHARED  对映射区修改的同时,也修该磁盘文件

● MAP_PRIVATE  在映射区创建一个磁盘文件的副本,对映射区修改并不影响磁盘文件

fd 是磁盘文件的文件描述符

offset 一般设置成 0

返回值:成功返回映射区地址,失败返回 MAP_FAILED

使用时的注意事项

1 不能通过 mmap 增加文件长度 
2 使用前应先打开文件。要不然 fd 填啥 :)

munmap

int munmap(void *addr, size_t length);

(读作 my unmap)

用于解除映射区

成功返回 0,失败返回 -1

简单实例

将当前目录下的 m.txt 映射到虚拟空间中,并将其输出到屏幕

#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

int main()
{
        int fd;
        int rv;
        int nwrite;
        struct stat sbuf;
        char *mbuf;

        fd = open("m.txt",  O_RDONLY);
        if(fd < 0) {
                perror("ope error");
                return -1;
        }
        rv = stat("m.txt", &sbuf);
        if(rv != 0) {
                perror("stat error");
                return -1;
        }

        mbuf = (char *)mmap(0, sbuf.st_size, PROT_READ, MAP_PRIVATE,fd, 0);
        if(mbuf == MAP_FAILED) {
                perror("mmap error");
                return -1;
        }
        nwrite = write(STDOUT_FILENO, mbuf, sbuf.st_size);
        munmap(mbuf, sbuf.st_size);
        close(fd);
        return 0;
}
上一篇:2021-03-24:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,


下一篇:2021-2-21:Java File MMAP 中,对 MappedByteBuffer 进行读写,为何最大只能2GB-1B?