4

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

4

4 回答 4

7

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

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

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

fallocate()是一个特定于 Linux 的函数,它可以做更多的事情,并且以非常具体的方式:

分配磁盘空间

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

...

释放文件空间

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

...

折叠文件空间

在 mode 中指定FALLOC_FL_COLLAPSE_RANGE标志(自 Linux 3.15 起可用)会从文件中删除一个字节范围,而不会留下漏洞。要折叠的字节范围从字节开始offset并继续len。操作完成时,从该位置开始的文件内容offset+len将被追加到位置偏移处,文件将len变小字节。

...

归零文件空间

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

...

增加文件空间

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

...

于 2018-03-19T11:30:12.997 回答
0

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

于 2018-03-20T05:57:27.420 回答
0

fallocate用于将块预分配给文件

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

fallocate -l 1G test_file1.img

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

ftruncate(fileno(fout),size);
于 2018-03-19T13:36:54.013 回答
0

使用 ftruncate 你可以告诉 linux 你想要这个文件的大小。如果文件变短(包括释放磁盘空间),它将截断额外空间或添加零,如果使文件变长,则分配磁盘空间。

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

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

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

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

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

于 2020-03-08T20:36:42.430 回答