如何丢弃/修剪打开文件中的范围?

如何丢弃/修剪打开文件中的范围?

ioctl()对于 SSD,我可以使用with命令打开行设备并丢弃一系列页面BLKDISCARD

我的问题是

对于一个打开的文件,如何丢弃一定范围的数据?这是否取决于底层文件系统的实现?

答案1

您正在寻找fallocateFALLOC_FL_PUNCH_HOLE。然后由文件系统丢弃/修剪/取消映射这些块。我相信ext4会这样做。

例如,您可以执行以下操作来丢弃从 1MiB 开始的 2MiB:

err = fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, 1048576, 2097152);
if (0 != err) {
    /* handle error */
}

如果成功,以后读取这些字节应该会返回 0。

[注意:POSIX 没有办法做到这一点。上面的fallocate是Linux特定的。但你把你的问题标记为 Linux,所以希望没问题。]

相关内容