【发布时间】:2020-05-10 00:57:30
【问题描述】:
我正在用以下方式试验 mmap,但我不明白它是否正确:
#include <fcntl.h> // open
#include <unistd.h> // ftuncate
#include <sys/mman.h> // mmap
#include <cstdlib>
#include <cstring>
#include <cstdio>
int main(){
off_t const size = 5 * 1024 * 1024;
const char *filename = "testfile";
int fd = open(filename, O_RDWR | O_TRUNC | O_CREAT, 0644);
ftruncate(fd, size);
char *mem = (char *) mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, /* offset */ 0);
const char *msg = "Hello";
memcpy(&mem[100], msg, strlen(msg));
memcpy(&mem[200], msg, strlen(msg));
memcpy(&mem[4 * 1024 * 1024], msg, strlen(msg));
}
据我所知,ftruncate 创建一个带孔的文件。以后mmap不会有问题吧?
这是否适用于 64 位系统上的 10 GB 文件?
在 Linux 上我应该使用fallocate(fd, FALLOC_FL_ZERO_RANGE, 0, 8 * size) 还是速度没有显着差异?
【问题讨论】:
-
对不起,例如,我在那里使用了 C++ 编译器
-
mmap()适用于有孔的文件。它处理逻辑数据,而不是物理磁盘块。 -
所以它“重新填充”了漏洞,最后所有数据都正确存储在磁盘上?
-
一切都一样。文件中的空洞只是一种优化,它们不会影响您访问文件的方式。
-
@Barmar:它们有一些作用:如果设备上有
ENOSPC,则写入孔可以SIGBUS。您希望posix_fallocate同步处理此问题,而不是通过讨厌的信号。