如果我截断到比原始大的大小,ftruncate()是否复制数据?

时间:2013-06-13 17:43:54

标签: linux file unix filesystems

http://pubs.opengroup.org/onlinepubs/7908799/xsh/ftruncate.html的描述来看,ftruncate的工作原理并不十分清楚。

如果假设,我将文件截断为1GB,然后截断为2GB。如果ftruncate在旧的1GB之后没有找到额外的1GB空间,它是否会将数据复制到新位置以保持文件连续?

2 个答案:

答案 0 :(得分:2)

文件不是连续开头的。使用树形结构的块映射,因此只需要向地图添加更多块。

此外,虽然这不是Posix的必需,但所有真正的类Unix系统都支持sparse files,,因此大多数情况下它只需要增加长度而不是实际添加块。稍后的读取将注意(在内核内部)缺少后备块,内核将知道只返回零。稍后写入未支持区域自然需要最终开始分配块。

答案 1 :(得分:1)

文件系统通过块设备提供间接,块设备也可以具有层和间接。磁盘也提供间接。

实际上,文件在第一个ftruncate之前不一定是连续的。

如果您的目标是保持数据连续,则可以在mkfsmount期间尝试特定于文件系统的调整。另外,您可以尝试ftruncate(或fallocate)而不是posix_fallocate