【问题标题】:What fallocate() does?fallocate() 做什么?
【发布时间】:2014-04-02 18:36:13
【问题描述】:

其实我有两个问题。

fallocate() 是做什么的?

我阅读了手册页并有以下理解。对于支持文件中的空洞的文件系统,fallocate() 用于在文件中打洞并分配新空间。对于没有漏洞的文件系统,fallocate()只能用于在文件结束后分配新空间,即只有在len + offset > file_size时才有效。

我的理解正确吗?如果是这样,我还有以下问题。

fallocate() vs ftruncate() 扩展文件时

现在我想创建一个新文件并在文件中分配特定大小的零填充字节。我意识到fallocate()ftruncate() 都可以完成这项工作。它们有什么区别?

顺便说一句,我知道fallocate() 不可移植,但由于我的程序仅适用于 Linux,因此未考虑到其他类 Unix 系统的可移植性。

谢谢!

【问题讨论】:

    标签: c linux unix filesystems


    【解决方案1】:

    在您的代码中使用posix_fallocate(3)。与ftruncate(2) 的不同之处在于(在支持它的文件系统上,例如Ext4)磁盘空间确实由posix_fallocate 保留,但ftruncate 通过添加孔来扩展文件(并且不保留磁盘空间)。

    例如如果你的磁盘是 100GB,而你 posix_fallocate 是一个 5Gb 的文件,你会看到(使用 df)可用空间减少了(因为在调用之前);如果您只执行ftruncate,您不会看到可用空间减少。

    另请参阅this answer 相关问题。

    【讨论】:

    • 感谢您的回答。一次分配整个文件比打一个大洞并逐页写入数据更好吗?
    • 这取决于您想要什么(以及您的系统和配置)。如果你那么在乎,那就进行基准测试!
    • 等等为什么我们需要 fallocate?我们可以在文件末尾写/写,对吗? fallocate 还提供了什么?
    • Erben Mo: fallocate 很有用,例如如果你想要 mmap 文件。
    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多