2012-11-30 142 views
4

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

回答

3

取消映射文件,通过任何常规手段扩展它(fseek结束+ fwrite)并将其再次映射。这应该是相当快的;被分页在文件的任何部分会留在分页。

您还可以扩展文件当它被映射然后mremap它。这应该很好,因为你没有改变任何映射的页面。这可能会影响操作系统。

Linux mmap manpage

改变映射的基本文件的大小上 对应于该文件的添加或去除的区域的网页的效果是 未指定的。

2

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

此(或文件扩展名的一些其它记录方法)所需的可移植程序无论如何,因为这两个the Posixthe Linux man page指出该文件不被写入超过端延长。