我想使用mmap()来读取一个长度固定的文件(例如。(64 but ),但也有一些文件<64 but。
我mmap这个文件(<64 got,例如30 got),长度=64 got,当读取超过文件大小(30 Got 64 Got)的文件数据时,程序得到一个bus-error。
我想要mmap这些文件的固定长度,并读取0x00当指针超过文件大小。怎么做?
我可以考虑的一种方法是先使用ftruncate文件,然后将ftruncate返回到ori大小,但我认为这种方法并不完美。
发布于 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 (您不需要单独取消映射真正的文件页和零背景页)。
非常简单的示例(没有错误检查,请自己添加):
// 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);https://stackoverflow.com/questions/51638604
复制相似问题