文件上的 mmap 有孔
mmap on file with holes
我正在通过以下方式尝试使用 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)
还是速度没有显着差异?
文件中的漏洞对任何正常的文件操作都没有影响,它们只是文件在磁盘上存储方式的优化。就读取、查找、内存映射等任何操作而言,它只是一长串零字节。文件系统驱动程序负责在将相关页面读入内存时将空洞变成零块。
fallocate()
和ftruncate()
的区别,见what's the difference between fallocate and ftruncate
我正在通过以下方式尝试使用 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)
还是速度没有显着差异?
文件中的漏洞对任何正常的文件操作都没有影响,它们只是文件在磁盘上存储方式的优化。就读取、查找、内存映射等任何操作而言,它只是一长串零字节。文件系统驱动程序负责在将相关页面读入内存时将空洞变成零块。
fallocate()
和ftruncate()
的区别,见what's the difference between fallocate and ftruncate