fallocate和ftruncate有什么区别

Len*_*nge 2 c linux glibc fallocate

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

And*_*nle 5

ftruncate是一个简单的单一功能。 根据POSIX文档,它只是将文件设置为请求的长度:

如果fildes引用的是常规文件,则该ftruncate()功能将导致文件的大小被截断为length。...

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

fallocate()是特定于Linux的函数,它以非常特定的方式做很多事情:

分配磁盘空间

fallocate的默认操作(即,模式是零)()分配规定的范围内的磁盘空间offsetlenstat(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开始可用)从文件中删除字节范围,而不会留下漏洞。要折叠的字节范围始于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字节为单位)。

...