gpt4 book ai didi

c - 在 C 中追加到文件开头

转载 作者:行者123 更新时间:2023-12-05 08:36:28 25 4
gpt4 key购买 nike

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

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

(说明 - Linux 中的系统调用)

最佳答案

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

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

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

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

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

关于c - 在 C 中追加到文件开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68863379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com