为什么没有文件插入系统调用

der*_*ann 11 system-calls file-copy files

据我了解,对于操作文件,Linux 中只有 sys_write 系统调用,它会覆盖文件内容(或扩展它,如果在最后)。

为什么在 Linux 中没有用于在文件中插入或删除内容的系统调用?

由于所有当前的文件系统都不需要将文件存储在连续的内存块中,因此应该有可能实现高效的实现。(文件会碎片化。)

由于文件系统具有“写入时复制”或“透明文件压缩”等特性,当前插入内容的方式似乎非常低效。

mos*_*svy 22

在最近的 Linux 系统上实际上是可能的,但是(大部分时间为 4096),而不是字节粒度,并且仅在某些文件系统(ext4 和 xfs)上。

引用手册fallocate(2)页:

int fallocate(int fd, int mode, off_t offset, off_t len);

[...]

折叠文件空间

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

[...]

增加文件空间

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


ilk*_*chu 9

由于当前所有的文件系统都不需要将文件存储在连续的内存块中,

文件系统可能不需要将文件存储在连续区域中(这确实非常不灵活),但通常文件存储在固定大小的块(或连续块序列)中。这样做可以简化实现,并且块通常是底层设备块大小的倍数。

因此,实现任意长度块的插入会使文件系统格式和实现变得更加复杂,或者需要移动潜在的大量数据。这些都不是很好,复杂的数据结构可以在文件系统 API 之上的用户空间中构建。