内存映射

Posted on 2023-03-01 10:08  lyc2002  阅读(22)  评论(0编辑  收藏  举报

介绍

#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
    • PROT_EXEC
    • PROT_NONE:内存段不能被访问
  • flags:控制内存段内容被修改后程序的行为
    • MAP_SHARED:对该内存段的修改将反映到文件中
    • MAP_PRIVATE:对该内存段的修改不会反映的被映射的文件中
    • MAP_ANONYMOUS
    • MAP_FIXED
    • MAP_HUGETLB
  • fd:被映射文件的文件描述符
  • offset:从文件何处开始映射

返回值:

  • 成功返回指向目标内存区域的指针
  • 失败返回 MAP_FAILED 即 ((void *)-1),并设置 errno
#include <sys/mman.h>

int munmap(void *addr, size_t length);

功能:释放由 mmap 映射的内存空间

参数:

  • addr:内存段的起始地址
  • length:内存段的长度

返回值:

  • 成功返回 0
  • 失败返回 -1,并设置 errno

简单使用

char *real_file = "test.txt";
struct stat file_stat;

stat(real_file, &file_stat);

int fd = open(real_file, O_RDONLY);

char *file_address = (char *)mmap(NULL, file_stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);

close(fd);

if (file_address) {
    munmap(file_address, file_stat.st_size);
    file_address = NULL;
}

注意事项