gpt4 book ai didi

c - 具有较大固定长度且填充为零的 mmap 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:49 24 4
gpt4 key购买 nike

我想使用 mmap()读取固定长度的文件(例如 64MB),但也有一些文件 < 64MB。

我映射长度为 64MB 的文件(<64MB,例如 30MB),当读取超过文件大小(30MB - 64MB)的文件数据时,程序得到一个 bus-error .

我想用固定长度映射这些文件,并在指针超出文件大小时读取 0x00。如何做到这一点?

我能想到的一种方法是 ftruncate先归档,然后 ftruncate回到 ori 大小,但我不认为这种方法是完美的。

最佳答案

这是 MAP_FIXED 的少数合理用例之一,用于重新映射现有映射的一部分以使用新的支持文件。

这里一个简单的解决方案是无条件地 mmap 64 MB 匿名内存(或显式 mmap /dev/zero),没有 MAP_FIXED 并存储结果指针。

接下来,mmap 64 MB 或您实际文件的实际文件大小(以较小者为准),传入匿名/零 mmap 的结果并传递MAP_FIXED 标志。与您的文件对应的页面将不再是匿名/零映射的,而是将由您的文件数据支持;其余页面将由匿名/零页面支持。

完成后,单个 munmap 调用将立即取消映射所有 64 MB(您不需要分别取消映射真实文件页面和零备份页面)。

极其简单的例子(没有查错,请自行添加):

// Reserve 64 MB of contiguous addresses; anonymous mappings are always zero backed
void *mapping = mmap(NULL, 64 * 1024 * 1024, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

// Open file and check size
struct stat sb;
int fd = open(myfilename, O_RDONLY);
fstat(fd, &sb);
// Use smaller of file size or 64 MB
size_t filemapsize = sb.st_size > 64 * 1024 * 1024 ? 64 * 1024 * 1024 : sb.st_size;
// Remap up to 64 MB of pages, replacing some or all of original anonymous pages
mapping = mmap(mapping, filemapsize, PROT_READ, MAP_SHARED | MAP_FIXED, fd, 0);
close(fd);

// ... do stuff with mapping ...
munmap(mapping, 64 * 1024 * 1024);

关于c - 具有较大固定长度且填充为零的 mmap 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51638604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com