附加到 C 中的文件开头

Tan*_*yal 2 c linux text append system-calls

如何使用 C 中的系统调用附加到文件的开头(而不是结尾)?

我已经阅读了 open() 的手册页。我没有找到任何允许我附加到文件开头的标志代码(类似于 O_APPEND)。

(澄清 - Linux 中的系统调用)

Nat*_*dge 9

自 4.1 以来的 Linux 版本都fallocate(2)带有FALLOC_FL_INSERT_RANGE标志,它允许您在文件中插入一个“洞”,然后您可以将数据写入其中。您可以在开头插入一个孔,用数据填充它,然后在第一个孔之后插入一个新孔,依此类推。但是,有一些主要的警告:

  • 它仅受某些文件系统支持(手册页提到 XFS 和 ext4)

  • 孔只能以文件系统块大小(通常为 4 KB)的倍数插入。因此,这仅在您的数据恰好是该大小的倍数时才有效,或者如果其格式可以安全地将其填充到该大小(例如,如果文件将由忽略空格的工具处理,其中如果您可以使用空格或换行符最多填充 4K)。

否则,没有什么比O_APPEND在文件开头或其他任何地方插入更通用的了。大多数文件系统的设计方式根本无法有效地实现这一点。文件通常设置为固定大小的块列表,最后是部分块。操作系统可以通过更新最后一个部分块,然后将新块添加到列表的末尾来附加到文件。它甚至可以在列表中的其他点插入新块,就像FALLOC_FL_INSERT_RANGE. 但是通常除了最后之外,列表中的任何地方都没有部分块的规定,因此插入不是完整块的数据需要在所有其他块中移动数据,这需要重写所有数据。

像 btrfs 这样的基于范围的文件系统原则上可以通过添加范围来支持在文件的开头插入任意长度的块。但是,至少在 Linux 5.4.0 中,据我所知,它实际上不受支持。