0

linux 调用

fallocate(fd, FALLOC_FL_KEEP_SIZE, offset, len);

可用于在文件结束后为文件预分配空间而不增加文件长度。(正确的?)

问题:当 fd 关闭时,这个磁盘空间会发生什么?是否释放了额外的空间,或者它是否仍然与文件相关联?

如果它仍然与文件关联,我如何释放该空间?截断(或 open() 和 ftruncate())是否释放空间?

4

1 回答 1

1

问题:当 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。

于 2021-12-30T23:43:04.187 回答