我已经使用mmap()将文件映射到内存中,我需要在文件末尾写入。我找不到任何确凿的文件证据,证明在这种情况下会发生什么。 This document表示超出EOF的访问权限未定义。有没有正确的方法来做到这一点?
答案 0 :(得分:3)
取消映射文件,通过任何常规方式扩展它(fseek结束+ fwrite)并再次mmap它。这应该很快;分页的文件的任何部分都将保持分页状态。
您还可以在映射时扩展文件,然后mremap。这应该可以正常工作,因为您没有更改任何映射的页面。这种影响可能与操作系统有关。
更改映射的基础文件大小的效果 与文件的添加或删除区域对应的页面是 未指定的。
答案 1 :(得分:2)
我会首先使用 truncate(2) 或ftruncate(2)来设置我想要的长度(它会使文件更大,尽管名称也是如此)然后mmap(2)
它。无论mmap(2)在写入超出原始EOF时的作用如何,这都将完全符合您的要求。
无论如何,便携式程序需要此(或其他一些文档扩展的文档扩展方法),因为 the Posix 和 the Linux man page 状态通过写到最后来扩展文件。