c - fallocate() 做什么?

标签 c linux unix filesystems

其实我有两个问题。

fallocate() 做什么?

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

我的理解对吗?如果是这样,我也有以下问题。

fallocate() vs ftruncate() 扩展文件

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

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

谢谢!

最佳答案

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

例如如果您的磁盘是 100Gbytes,并且您posix_fallocate 一个 5Gb 文件,您将看到(使用 df)可用空间已经减少(自调用之前);如果您只执行 ftruncate,您不会看到可用空间减少。

另见 this answer一个相关的问题。

关于c - fallocate() 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22820139/

相关文章:

c - 不明白CII书第108页中的函数List_list

linux - ptrace 能否判断 x86 系统调用使用的是 64 位还是 32 位 ABI?

bash - 使用 Perl、sed、awk 替换多行模式

c - 尽管管道关闭,读取仍继续阻塞

c - 使用递归退出条件进行字符串反转

c - strtok_r 上的段错误

php - 如何让我的php程序一直在linux下运行?

linux - 连接丢失后,可运行的 jar 文件会在主机上运行吗?如果是,如何运行?

c - 如何使用共享内存和信号量实现管道?

linux - 同一服务器上多个 NIC 上的多个 IP 配置