从http://pubs.opengroup.org/onlinepubs/7908799/xsh/ftruncate.html的描述来看,ftruncate的工作原理并不十分清楚。
如果假设,我将文件截断为1GB,然后截断为2GB。如果ftruncate在旧的1GB之后没有找到额外的1GB空间,它是否会将数据复制到新位置以保持文件连续?
答案 0 :(得分:2)
文件不是连续开头的。使用树形结构的块映射,因此只需要向地图添加更多块。
此外,虽然这不是Posix的必需,但所有真正的类Unix系统都支持sparse files,,因此大多数情况下它只需要增加长度而不是实际添加块。稍后的读取将注意(在内核内部)缺少后备块,内核将知道只返回零。稍后写入未支持区域自然需要最终开始分配块。
答案 1 :(得分:1)
文件系统通过块设备提供间接,块设备也可以具有层和间接。磁盘也提供间接。
实际上,文件在第一个ftruncate
之前不一定是连续的。
如果您的目标是保持数据连续,则可以在mkfs
或mount
期间尝试特定于文件系统的调整。另外,您可以尝试ftruncate
(或fallocate
)而不是posix_fallocate
。