截断内存映射文件

时间:2011-09-28 18:16:27

标签: c ios mmap

我想使用读/写内存映射文件来管理我正在创建的一些索引(unsigned int)。

我已按照herehere

找到的代码示例进行操作

我最初不知道文件的大小,所以我打算开始使用4K,并相应地增长。

但是,我不确定在完成地图后如何截断文件。因此,如果我只在文件中使用大约1K,我想将其截断为1K并且不会在此过程中浪费3K。我关心的不是浪费文件空间,而是检查文件的大小以确定我有多少unsigned int

修改

所以澄清......虽然文件是内存映射的...我正在分配4K块...当我完成内存映射文件时,我想清理文件所以它正是我的已经投入其中。

3 个答案:

答案 0 :(得分:2)

使用ftruncate截断您的文件,它只需要文件描述符和大小。然后,您可以使用fstat查询基础文件的属性,并使用从那里获得的大小来标注未来的映射。

答案 1 :(得分:2)

如果ftruncate()文件,则必须“同时”mremap()映射到新大小。你可以对范围做类似的事情(但这可能会导致mremap将段放在地址空间的不同部分)

答案 2 :(得分:-1)

尝试优化时,请使用getpagesize()返回的值。这是标准的系统内存页面大小,无需截断它。