如何使用C在Linux中自动和异步地写入文件

时间:2019-08-06 20:11:22

标签: c linux embedded-linux ext4 fsync

问题

如何在不要求程序等待慢速物理媒体(例如使用fsync的情况下)自动更新文件?

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


背景

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

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

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

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


到目前为止我学到的东西

似乎已经围绕ext4fsync的正确使用进行了很多讨论。如果我理解正确,如果我的文件系统(link)启用了fsync,我可能可以放弃使用auto_da_alloc,但我不能深信这是最好的解决方案。

1 个答案:

答案 0 :(得分:0)

我发现Linux文件系统具有显着的弹性和可靠性。我将主要讨论2009年以来的ext4问题。Linux信息已过时。

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

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

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

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

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