您的位置:首页 >C++ Linux系统中怎样进行内存映射
发布于2026-05-02 阅读(0)
扫一扫,手机访问
说到在Linux环境下用C++操作内存映射,绕不开一个核心的系统调用——mmap。它的妙处在于,能把文件或设备直接“搬”到进程的地址空间里。这意味着,后续的读写操作可以直接在内存里完成,完全跳过了传统的文件I/O函数,效率的提升是显而易见的。

光说概念可能有点抽象,咱们直接看一段代码,这是使用mmap的一个基础模板:
#include
#include
#include
#include
#include
int main() {
const char* filename = "example.txt"; // 要映射的文件名
int fd = open(filename, O_RDONLY); // 打开文件
if (fd == -1) {
perror("open");
return EXIT_FAILURE;
}
struct stat sb;
if (fstat(fd, &sb) == -1) {
perror("fstat");
close(fd);
return EXIT_FAILURE;
}
// 映射文件到内存
void* addr = mmap(nullptr, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
close(fd);
return EXIT_FAILURE;
}
// 现在可以通过addr访问文件内容了
std::cout << "File content:" << std::endl;
std::cout.write(static_cast(addr), sb.st_size);
// 解除映射
if (munmap(addr, sb.st_size) == -1) {
perror("munmap");
}
close(fd);
return EXIT_SUCCESS;
}
我们来拆解一下这段代码的关键步骤。首先,程序会打开目标文件并获取其大小,这是为映射做准备。接下来,重头戏来了——调用mmap函数。
这个函数的参数决定了映射的行为:第一个参数是期望的起始地址,设为nullptr意味着把选择权交给系统,让它找个合适的地方。第二个参数是映射区域的大小,这里自然就是文件的大小。第三个参数PROT_READ设定了权限,表示这块内存区域只读。第四个标志MAP_PRIVATE很关键,它表明这是一个“私有”映射,也就是说,即便你在内存里修改了内容,也不会同步回原文件。最后两个参数分别指定了文件描述符和映射的起始偏移量,这里从文件开头开始。
一旦映射成功,返回的地址addr就成了访问文件内容的直接入口,像操作普通内存一样方便。流程的最后,别忘了用munmap解除映射并关闭文件,完成资源清理。
当然,这个示例是一个最简化的场景,它假设文件已存在且可读。在实际开发中,错误处理和边界条件的考量要复杂得多。另外,一个需要警惕的要点是同步问题:如果你做的是可写映射,务必确保在解除映射前,所有修改都已妥善完成,避免数据丢失或损坏。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9