使用 mmap 与 fstream 或 fopen 访问二进制文件
Accessing binary files with mmap vs fstream or fopen
我不知道 mmap()
可以读取二进制文件。我曾经认为mmap()
只能用于Linux中的IPC(进程间通信),以便在不相关的进程之间交换数据。
有人可以解释一下如何使用 mmap()
读取文件吗?我听说它在随机访问二进制文件时有很大的优势。
好吧,mmap
ping 文件的方式与 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
,操作系统将更好地了解文件的哪些部分应该保存在内存/缓冲区缓存中,哪些不应该保存。
我不知道 mmap()
可以读取二进制文件。我曾经认为mmap()
只能用于Linux中的IPC(进程间通信),以便在不相关的进程之间交换数据。
有人可以解释一下如何使用 mmap()
读取文件吗?我听说它在随机访问二进制文件时有很大的优势。
好吧,mmap
ping 文件的方式与 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
,操作系统将更好地了解文件的哪些部分应该保存在内存/缓冲区缓存中,哪些不应该保存。