6

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

4

2 回答 2

4

取消映射文件,通过任何常规方式扩展它(fseek to end + fwrite)并再次对其进行映射。这应该很快;分页的文件的任何部分都将保持分页。

您还可以在映射文件时对其进行扩展,然后对其进行mremap。这应该可以正常工作,因为您没有更改任何映射页面。其效果可能取决于操作系统。

Linux mmap 手册页

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

于 2012-11-30T22:28:13.280 回答
3

我会先使用truncate(2)或 ftruncate(2) 来设置我想要的长度(它也会使文件变大,尽管有名字),然后mmap(2)是它。这将完全按照您的意愿执行,无论 mmap(2) 在您超出原始 EOF 进行写入时会做什么。

无论如何,这(或一些其他记录的文件扩展方法)对于可移植程序来说都是必需的,因为PosixLinux 手册页都指出,文件不会通过超出末尾的写入来扩展。

于 2012-11-30T22:20:58.213 回答