fallocate和ftruncate之间有什么区别

时间:2018-03-19 10:41:23

标签: c linux glibc fallocate

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

4 个答案:

答案 0 :(得分:5)

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

  

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

ftruncate()也是标准的POSIX功能,可移植。请注意,POSIX未指定操作系统设置文件长度的 ,例如设置为任意长度的文件是否为a sparse file

fallocate() is a Linux-specific function以更具体的方式提供更多功能:

  

分配磁盘空间

     

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

     

...

     

取消分配文件空间

     

指定FALLOC_FL_PUNCH_HOLE标志(自Linux以来可用)          2.6.38)在模式中释放字节中的空间(即,创建一个洞)          范围从offset开始,持续len个字节。内          指定范围,部分文件系统块归零,整体          文件系统块将从文件中删除。成功后          调用,此范围的后续读取将返回零。

     

...

     

折叠文件空间

     

指定FALLOC_FL_COLLAPSE_RANGE标志(自Linux以来可用)          3.15)in模式从文件中删除一个字节范围,而不离开          洞。要折叠的字节范围从offset开始并继续          用于len个字节。在完成操作,内容          从位置offset+len开始的文件将附加在。{          位置偏移量,文件将小len个字节。

     

...

     

归零文件空间

     

指定FALLOC_FL_ZERO_RANGE标志(自Linux 3.15起可用)          in mode在从offset开始的字节范围中将空格归零          继续len个字节。在指定的范围内,块是          预分配用于跨越文件中的孔的区域。后          如果成功通话,则此范围的后续读取将返回          零。

     

...

     

增加文件空间

     

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

     

...

答案 1 :(得分:0)

fallocate 用于将块预分配到文件

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

fallocate -l 1G test_file1.img

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

ftruncate(fileno(fout),size);

答案 2 :(得分:0)

我现在知道:
1.fallocate无法将文件更改为更短。它为文件添加实际空间。
2.ftruncate将len添加到"描述",就像声明一样。

答案 3 :(得分:0)

使用ftruncate,您可以告诉linux您希望此文件的大小。 如果文件越来越短(包括释放磁盘空间)或增加零,它将截断额外的空间;如果使文件更长,它将分配磁盘空间。

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

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

使用fallocate,您可以在不逻辑增长文件的情况下预分配磁盘空间(例如,在ls级别使用1GB的零字节文件)。

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

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