Boost.IOStreams 仅具有固定大小的memory mapped files,因此对您的具体问题没有帮助。 Linux 有一个接口mremap,其工作原理如下:
void *new_mapping = mremap(mapping, size, size + GROWTH, MREMAP_MAYMOVE);
if (new_mapping == MAP_FAILED)
// handle error
mapping = new_mapping;
但是,这是不可移植的(并且文档记录不充分)。 Mac OS X 好像没有mremap。
无论如何,您都不需要重新打开文件,只需munmap 和mmap 再次:
void *append(int fd, char const *data, size_t nbytes, void *map, size_t &len)
{
// TODO: check for errors here!
ssize_t written = write(fd, data, nbytes);
munmap(map, len);
len += written;
return mmap(NULL, len, PROT_READ, 0, fd, 0);
}
预分配方案在这里可能非常有用。请务必跟踪文件的实际长度并在关闭前再次截断它。