【问题标题】:mmap on file with holes带有孔的文件上的 mmap
【发布时间】: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 同步处理此问题,而不是通过讨厌的信号。

标签: c mmap


【解决方案1】:

文件中的空洞对任何正常的文件操作都没有影响,它们只是文件在磁盘上存储方式的优化。就读取、查找、内存映射等任何操作而言,它只是一长串零字节。在将相关页面读入内存时,文件系统驱动程序负责将漏洞变成零块。

fallocate()ftruncate()的区别见what's the difference between fallocate and ftruncate

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 2016-12-21
    • 2019-11-07
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多