linux

C++如何在Linux进行内存映射文件操作

小樊
45
2025-09-13 05:55:23
栏目: 编程语言

在Linux中,可以使用mmap()系统调用进行内存映射文件操作。mmap()允许将一个文件或设备映射到进程的地址空间,从而可以直接通过内存访问文件内容,而无需使用文件I/O函数(如read()write())。

以下是一个简单的示例,展示了如何在Linux中使用C++进行内存映射文件操作:

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

int main() {
    const char *filename = "test.txt";
    int fd = open(filename, O_RDONLY);
    if (fd == -1) {
        std::cerr << "Error opening file: " << strerror(errno) << std::endl;
        return 1;
    }

    struct stat sb;
    if (fstat(fd, &sb) == -1) {
        std::cerr << "Error getting file size: " << strerror(errno) << std::endl;
        close(fd);
        return 1;
    }

    size_t file_size = sb.st_size;
    void *addr = mmap(nullptr, file_size, PROT_READ, MAP_PRIVATE, fd, 0);
    if (addr == MAP_FAILED) {
        std::cerr << "Error mapping file: " << strerror(errno) << std::endl;
        close(fd);
        return 1;
    }

    // 访问映射的内存
    char *data = static_cast<char *>(addr);
    for (size_t i = 0; i < file_size; ++i) {
        std::cout << data[i];
    }
    std::cout << std::endl;

    // 修改映射的内存
    data[0] = 'H';

    // 将更改写回文件
    if (msync(addr, file_size, MS_SYNC) == -1) {
        std::cerr << "Error syncing memory: " << strerror(errno) << std::endl;
    }

    munmap(addr, file_size);
    close(fd);

    return 0;
}

这个示例中,我们首先打开一个名为test.txt的文件,并获取其大小。然后,我们使用mmap()将文件映射到内存中。接下来,我们可以直接访问和修改映射的内存。最后,我们使用msync()将更改写回文件,并使用munmap()取消内存映射。

注意:在使用mmap()时,需要确保文件大小不超过系统的最大内存映射限制。可以使用ulimit -l命令查看当前限制。

0
看了该问题的人还看了