首页 > 解决方案 > 如何使用 C 在 Linux 中以原子方式和异步方式编写文件

问题描述

问题

如何在不需要我的程序等待慢速物理介质(例如 with fsync)的情况下自动更新文件?

我希望操作系统可以“缓冲”RAM中的典型fsync和操作,然后在方便时以正确的顺序rename将它们写入磁盘。


背景

我正在开发在带有ext4文件系统的自定义嵌入式 Linux 环境中运行的软件。该程序定期更新磁盘上的文件。我需要在不牺牲应用程序性能的情况下保持此文件的完整性。

根据我的阅读安全更新文件的公认做法如下:

  1. 创建一个新的临时文件
  2. 将数据写入临时文件
  3. fsync()临时文件
  4. 将临时文件重命名为适当的名称
  5. fsync()包含目录

这个过程对我来说很有意义,但在我的特定应用程序中,我想避免阻塞调用fsync(). 我不在乎数据何时写入磁盘,只要文件始终处于有效状态即可。如果文件已过期,那没关系。


到目前为止我学到了什么

似乎已经有相当多的讨论ext4和正确使用fsync. 如果我理解正确,我可能会放弃使用fsyncif auto_da_allocis enabled for my filesystem ( link ),但我不相信这是最好的解决方案。

标签: clinuxembedded-linuxext4fsync

解决方案


我发现 Linux 文件系统非常灵活和可靠。我会怀疑 ext4 问题的讨论大多来自 2009 年。Linux 信息过时了。

也就是说,如果要求保证您使用文件的最新正确版本,请添加一个步骤来检查文件是否正确。一种方法是使用 Linux 工具生成文件的哈希。也许有一种更快的方法可以处理您的特定数据,例如查找特定文件长度。

有了这些,您的算法可能是:

  1. 重命名当前文件以表明它是旧副本。
  2. 写入新文件
  3. 计算新文件的哈希

现在,当您启动或使用该文件时,您可以检查哈希,如果失败,则恢复到最新的旧副本。

此计划的优点是哈希将保护您免受文件损坏的任何来源,而不仅仅是 ext4 文件系统问题。


推荐阅读