Linux--mmap存储映射

2024-11-12  本文已影响0人  锈色的栅栏

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


上一篇 下一篇

猜你喜欢

热点阅读