mmap带孔的文件

问题描述 投票:0回答:1

我正在以以下方式尝试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
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.