据我了解,在Linux中,只有用于操纵文件的sys_write syscall才会覆盖文件内容(或扩展到文件末尾)。
为什么在Linux中没有用于在文件中插入或删除内容的系统调用?
由于当前所有文件系统都不需要将文件存储在连续的内存块中,因此应该有可能实现高效的实现。(文件将变得碎片化。)
由于文件系统具有“写时复制”或“透明文件压缩”功能,因此当前插入内容的方式似乎效率很低。
据我了解,在Linux中,只有用于操纵文件的sys_write syscall才会覆盖文件内容(或扩展到文件末尾)。
为什么在Linux中没有用于在文件中插入或删除内容的系统调用?
由于当前所有文件系统都不需要将文件存储在连续的内存块中,因此应该有可能实现高效的实现。(文件将变得碎片化。)
由于文件系统具有“写时复制”或“透明文件压缩”功能,因此当前插入内容的方式似乎效率很低。
Answers:
在最新的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
添加到location处offset
,并且文件将len
变小字节。[...]
增加文件空间
在不指定任何现有数据的情况下,通过在文件大小中插入一个孔来指定
FALLOC_FL_INSERT_RANGE
标志(从Linux 4.1开始可用)来mode
增加文件空间。孔将从处开始offset
并继续len
字节。在文件中插入孔时,从处开始的文件内容offset
将向上移动(即,移至更高的文件偏移量)len
字节。在文件内插入孔会增加文件大小(以len
字节为单位)。