首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mmap文件与较大的固定长度与零填充?

mmap文件与较大的固定长度与零填充?
EN

Stack Overflow用户
提问于 2018-08-01 16:54:55
回答 1查看 792关注 0票数 0

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

我mmap这个文件(<64 got,例如30 got),长度=64 got,当读取超过文件大小(30 Got 64 Got)的文件数据时,程序得到一个bus-error

我想要mmap这些文件的固定长度,并读取0x00当指针超过文件大小。怎么做?

我可以考虑的一种方法是先使用ftruncate文件,然后将ftruncate返回到ori大小,但我认为这种方法并不完美。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 02:28:01

这是少数几个合理的MAP_FIXED用例之一,可以重新映射现有映射的一部分以使用新的备份文件。

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

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

完成后,一个单独的munmap调用将同时解除映射所有64 MB (您不需要单独取消映射真正的文件页和零背景页)。

非常简单的示例(没有错误检查,请自己添加):

代码语言:javascript
复制
// 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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51638604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档