linux 调用
fallocate(fd, FALLOC_FL_KEEP_SIZE, offset, len);
可用于在文件结束后为文件预分配空间而不增加文件长度。(正确的?)
问题:当 fd 关闭时,这个磁盘空间会发生什么?是否释放了额外的空间,或者它是否仍然与文件相关联?
如果它仍然与文件关联,我如何释放该空间?截断(或 open() 和 ftruncate())是否释放空间?
问题:当 fd 关闭时,这个磁盘空间会发生什么?是否释放了额外的空间,或者它是否仍然与文件相关联?
什么都没发生。分配的空间与 fd 无关。
如果它仍然与文件关联,我如何释放该空间?截断(或 open() 和 ftruncate())是否释放空间?
truncate() 是回收空间的主要方法。另一种方法是删除文件。您也可以尝试在文件的“过度分配”部分使用 FALLOC_FL_PUNCH_HOLE 和 FALLOC_FL_KEEP_SIZE 调用 fallocate(),尽管这看起来很混乱并且可能会留下伪影。
在后台,使用 FALLOC_FL_KEEP_SIZE 扩展文件将分配文件系统中的块,但将它们标记为未初始化。并非所有文件系统都支持这一点。到目前为止,这与没有保留大小标志的调用 fallocate() 相同。与保持大小标志的区别在于它将保持 inode 中的大小字段(与块分配无关)不变。所有这些都发生在磁盘上;在外壳中,您可以使用
ls -s
或者
stat
观察真正分配的块计数,独立于用于进行 fallocate() 调用的进程/fd。