mmap超出文件末尾

时间:2012-11-30 22:15:49

标签: unix file-io mmap

我已经使用mmap()将文件映射到内存中,我需要在文件末尾写入。我找不到任何确凿的文件证据,证明在这种情况下会发生什么。 This document表示超出EOF的访问权限未定义。有没有正确的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

取消映射文件,通过任何常规方式扩展它(fseek结束+ fwrite)并再次mmap它。这应该很快;分页的文件的任何部分都将保持分页状态。

您还可以在映射时扩展文件,然后mremap。这应该可以正常工作,因为您没有更改任何映射的页面。这种影响可能与操作系统有关。

Linux mmap manpage

  

更改映射的基础文件大小的效果   与文件的添加或删除区域对应的页面是   未指定的。

答案 1 :(得分:2)

我会首先使用 truncate(2) 或ftruncate(2)来设置我想要的长度(它会使文件更大,尽管名称也是如此)然后mmap(2)它。无论mmap(2)在写入超出原始EOF时的作用如何,这都将完全符合您的要求。

无论如何,便携式程序需要此(或其他一些文档扩展的文档扩展方法),因为 the Posix the Linux man page 状态通过写到最后来扩展文件。