使用 mmap 与 fstream 或 fopen 访问二进制文件

Accessing binary files with mmap vs fstream or fopen

我不知道 mmap() 可以读取二进制文件。我曾经认为mmap()只能用于Linux中的IPC(进程间通信),以便在不相关的进程之间交换数据。

有人可以解释一下如何使用 mmap() 读取文件吗?我听说它在随机访问二进制文件时有很大的优势。

好吧,mmapping 文件的方式与 IPC 或映射匿名内存的方式相同。在映射匿名内存的情况下,未写入的部分将根据需要用归零页面填充。

在映射文件的情况下,与文件内容对应的页面在访问时(以及写入时)从文件/或缓冲区缓存中读取。读取或写入超出文件大小的结果将导致 。本质上,mmap 返回的指针可以被视为与 malloc 返回的指针类似的方式,除了映射的大小/映射中的文件末尾字节是自动读取 / 并可能透明地写入支持文件。

示例:

fd = open("input.txt", O_RDWR, 0666);
fstat(fd, &stat_result); 
char* contents = mmap(0, stat_result->st_size,
                      PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

(省略错误检查)

执行后可以认为contents指向stat_result->st_size个字符的字符数组的第一个字节,可以像普通数组一样使用,操作系统会透明地将更改写回到文件中。


有了 mmap,操作系统将更好地了解文件的哪些部分应该保存在内存/缓冲区缓存中,哪些不应该保存。