掌握C语言 mmap,轻松实现内存映射文件操作

发布时间:2025-05-23 00:32:00

内存映射文件(Memory-mapped file)是一种将文件映射到过程的虚拟地点空间的技巧。经由过程这种方法,文件的内容可能直接被当作内存来拜访,如许就可能像操纵内存一样停止文件读写操纵,进步了顺序的效力跟便捷性。在C言语中,我们可能利用mmap函数来实现内存映射文件操纵。

一、mmap函数概述

在C言语中,mmap函数定义在头文件<sys/mman.h>中。它的原型如下:

void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

其中:

  • addr:指向欲对应的内存肇端地点,平日设为NULL,让体系主动选定地点。
  • len:代表将文件中多大年夜的部分对应到内存。
  • prot:代表映射地区的保护方法,有以下多少种组合:
    • PROT_READ:映射地区可被读取;
    • PROT_WRITE:映射地区可被写入;
    • PROT_EXEC:映射地区可被履行;
    • PROT_NONE:映射地区不克不及存取。
  • flags:会影响映射地区的各种特点,以下是一些常用的标记:
    • MAP_SHARED:映射地区的写入数据会复制回文件内,并且容许其他映射该文件的过程共享。
    • MAP_PRIVATE:映射地区的写入操纵会产生一个映射文件的复制,即私家的”写入时复制” (copy on write),对此地区作的任何修改都不会写回本来的文件内容。
    • MAP_ANONYMOUS:树破匿名映射,此时会忽视参数fd,不涉及文件,并且映射地区无法跟其他过程共享。
    • MAP_DENYWRITE:只容许对应射地区的写入操纵,其他对文件直接写入的操纵将会被拒绝。
    • MAP_LOCKED:将映射地区锁定住,这表示该地区不会被置换(swap)。
  • fd:文件描述符,平日是挪用open函数打开文件后掉掉落的。
  • offset:文件映射的偏移量,平日设置为0,代表从文件最前方开端对应。

二、利用mmap停止内存映射文件操纵

下面是一个利用mmap函数停止内存映射文件操纵的示例代码:

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

int main() {
    int fd = open("example.txt", O_RDWR); // 打开文件
    if (fd == -1) {
        perror("open");
        return 1;
    }

    struct stat sb;
    if (fstat(fd, &sb) == -1) {
        perror("fstat");
        close(fd);
        return 1;
    }

    char *map = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (map == MAP_FAILED) {
        perror("mmap");
        close(fd);
        return 1;
    }

    // 修改文件内容
    map[0] = 'A';

    // 排除映射
    if (munmap(map, sb.st_size) == -1) {
        perror("munmap");
        close(fd);
        return 1;
    }

    // 封闭文件描述符
    close(fd);

    return 0;
}

鄙人面的代码中,我们起首利用open函数打开了一个名为example.txt的文件。然后,利用fstat函数获取文件的大小,以便我们可能转达正确的len参数给mmap函数。接上去,我们利用mmap函数将文件内容映射到内存中。在映射后的内存中,我们修改了文件的第一字节,然后利用munmap函数排除映射关联。最后,我们封闭了文件描述符。

经由过程利用mmap函数,我们可能轻松实现内存映射文件操纵,进步顺序效力。