Linux--mmap存储映射

1、mmap概述

存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件

2、mmap的API

1、建立文件和内存的映射

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

功能:
        建立文件和内存的映射
参数:
    addr 地址,填NULL
    length 长度 要申请的映射区的长度
    prot 权限
        PROT_READ 可读
        PROT_WRITE 可写
    flags 标志位
        MAP_SHARED 共享的 -- 对映射区的修改会影响源文件
        MAP_PRIVATE 私有的
    fd 文件描述符 需要打开一个文件
    offset 指定一个偏移位置 ,从该位置开始映射 (1024的整数倍)
返回值
    成功 返回映射区的首地址
    失败 返回 MAP_FAILED ((void *) -1)

2、拓展文件大小

#include<unistd.h>
#include<sys/types.h>
int truncate(const char*path,off_t length);

功能:
        拓展文件大小
参数:
        path 要拓展的文件
        length 要拓展的长度
返回值:
        成功 0
        失败 -1

3、释放映射区域(只能解除本进程的映射)

int munmap(void * addr ,size_t length);

功能:
    释放映射区域
参数:
    addr 映射区的首地址
    length 映射区的长度
返回值
    成功 返回0
    失败 返回 -1

示例代码

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<unistd.h>
#include<string.h>
int main(int argc,char const*argv[])
{
        //通过open事先打开文件
        int fd = open("tmp", O_RDWR | O_CREAT, 0666);
        if (fd < 0)
        {
            perror("open");
            return 0;
        }
        //拓展文件大小
        truncate("tmp", 16);
        //建立映射
        char *buf = (char *)mmap(NULL, 16, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        //使用区域
        strcpy(buf, "hello mmap");
        //断开映射
         munmap(buf, 16);
         return 0;
}


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容