【问题标题】:what's the difference between fallocate and ftruncatefallocate 和 ftruncate 有什么区别
【发布时间】:2018-08-27 21:26:01
【问题描述】:

他们都可以根据我的测试改变文件大小。 为什么他们都可以将文件更改为更大或更短? fallocate 和 ftruncate 有什么区别?

【问题讨论】:

标签: c linux glibc fallocate


【解决方案1】:

ftruncate 是一个简单的、单一用途的函数。 Per the POSIX documentation,它只是将文件设置为请求的长度:

如果fildes 引用常规文件,ftruncate() 函数将导致文件大小被截断为length。 ...

ftruncate() 也是一个标准的 POSIX 函数并且是可移植的。请注意,POSIX 没有指定操作系统如何设置文件长度,例如设置为任意长度的文件是否为a sparse file

fallocate() is a Linux-specific function 做得更多,而且以非常具体的方式:

分配磁盘空间

fallocate() 的默认操作(即模式为零)分配 offsetlen 指定范围内的磁盘空间。这 如果offset+len 是,文件大小(由stat(2) 报告)将被更改 大于文件大小。指定范围内的任何子区域 通过调用前不包含数据的偏移量和 len 将 初始化为零。此默认行为非常类似于 posix_fallocate(3) 库函数的行为,旨在 作为优化实现该功能的一种方法。

...

释放文件空间

指定FALLOC_FL_PUNCH_HOLE 标志(Linux 起可用 2.6.38) in mode 释放字节中的空间(即创建一个孔) 范围从 offset 开始并持续到 len 字节。内 指定范围,部分文件系统块归零,整个 文件系统块从文件中删除。一次成功后 调用后,从此范围内的后续读取将返回零。

...

折叠文件空间

指定FALLOC_FL_COLLAPSE_RANGE 标志(从Linux 开始可用 3.15) in mode 从文件中删除一个字节范围,而不留下一个 洞。要折叠的字节范围从offset 开始并继续 对于len 字节。操作完成后,内容 从位置offset+len 开始的文件将附加到 位置偏移,文件将小len 字节。

...

归零文件空间

指定 FALLOC_FL_ZERO_RANGE 标志(自 Linux 3.15 起可用) 在模式中,从offset 开始的字节范围内的空间为零,并且 继续len 字节。在指定范围内,块是 为跨越文件中空洞的区域预先分配。后 一个成功的调用,从这个范围内的后续读取将返回 零。

...

增加文件空间

指定FALLOC_FL_INSERT_RANGE 标志(从Linux 开始可用 4.1) in mode 通过在文件中插入一个洞来增加文件空间 文件大小而不覆盖任何现有数据。洞会开始 在offset 并继续len 字节。将孔插入内部时 文件,以offset 开始的文件内容将被移动 向上(即到更高的文件偏移量)len 字节。插入一个 文件中的空洞会使文件大小增加len 字节。

...

【讨论】:

    【解决方案2】:

    fallocate 用于将块预分配给文件

    以下命令将分配一个大小为 1GB 的文件。

    fallocate -l 1G test_file1.img
    

    ftruncate - 将文件设置为指定长度

    ftruncate(fileno(fout),size);
    

    【讨论】:

    • fallocate 有多种用途,你把它简化了。
    【解决方案3】:

    据我所知:
    1.fallocate 不能将文件更改为更短。它为文件添加了实际空间。
    2.ftruncate 将len 添加到“describe”,就像声明一样。

    【讨论】:

      【解决方案4】:

      使用 ftruncate 告诉 linux 你希望这个文件的大小。 如果文件变短(包括释放磁盘空间),它将截断多余的空间,或者添加零,如果文件变长则分配磁盘空间。

      fallocate 是一个通用函数,用于将范围更改为属于文件的字节。

      根据您使用 fallocate 的方式,您可以使用 ftruncate 和 fallocate 完成所有可能的事情。它只是有点复杂,因为您必须知道需要分配/取消分配的范围(初始偏移量+长度)。

      使用 fallocate,您可以预先分配磁盘空间,而无需在逻辑上增加文件(例如使用 1GB 的 ls 级别的零字节文件)。

      我刚刚编写了一个 C 程序,使用 fallocate 和 ftruncate 通过直接 I/O 对文件执行高性能 gzip 压缩。我使用 fallocate 一次为文件预分配 64MB。最后我使用 ftruncate 来修剪分配的多余空间。

      与 XFS 完美配合,我确认 ftruncate 实际上使用 xfs_bmap -vp 在一些文件上释放了磁盘空间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        • 2015-03-26
        相关资源
        最近更新 更多