ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-12-22 11:02:14  阅读:211  来源: 互联网

标签:文件 映射 int mmap fd include 存储空间


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;
}

标签:文件,映射,int,mmap,fd,include,存储空间
来源: https://www.cnblogs.com/sau-autumnwind/p/14171855.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有