如果我的程序检测到几秒钟内将发生断电,它可以采取什么措施来避免数据损坏?

如果我的程序检测到几秒钟内将发生断电,它可以采取什么措施来避免数据损坏?

程序(需要从文件系统读取和写入)具有能够与外部传感器通信的额外功能。因此,它具有了解断电是否即将发生的独特能力。我收到的警告只有几秒(大约 3 到 5 秒)——不足以执行完全关闭。可能会增加几秒钟的宝贵时间,但这会增加硬件成本。

因为写入文件并不能保证操作系统能够完成这项工作现在,据我所知,即使关闭文件也会导致操作系统决定如果没有其他人尝试访问它,它将稍后关闭,那么我如何保证

  1. 我现在执行的所有写入都将被保存。 (收到警告后,我的程序将向磁盘写入几千字节,但在收到警告之前可能已写入大量数据,操作系统可能会或可能尚未最终确定这些数据)
  2. 不会因操作系统关闭不当而发生其他损坏。

注意:根据设计,断电可能是经常发生的情况。另外,根据设计,系统上不会运行其他“用户应用程序”(因此我们不必担心音乐播放器、开发环境、电子表格编辑器和 gimp 等所有运行和访问文件系统的情况)。

答案1

您需要做的主要事情是发出sync系统调用。有一个sync实用程序可以做到这一点。当sync系统调用返回时,它保证在sync完成之前发出的任何文件系统写入操作(在任何已安装的文件系统上)。

由您的应用程序设计来确保如果这种情况发生在一系列写入操作的中间,数据仍处于可用状态。然而,如果您在断电前有一个有保证的警告期,那么只要您保证及时响应断电通知(这很难),您的应用程序设计就可以比较马虎。

对于 ext4 等日志文件系统,如果您同步然后关闭电源,则在重新启动时不会收到 fsck。但是,如果某些原因导致同步后写入,我认为可能需要 fsck,但这种情况很少见。如果您想绝对确定,请在断电前卸载所有读写文件系统,或者至少将它们重新挂载为只读。通常,如果有打开的文件可供写入,则无法执行此操作。如果您的系统运行 Linux,您可以使用它的魔法系统功能(您需要确保它已启用)。这可以通过写入一个字符以编程方式调用/proc/sysrq-triggerecho u >/proc/sysrq-trigger强制将所有文件系统重新安装为只读(这包括同步的效果)。如果您的设置有用,您还可以使用此界面重新启动 ( b) 或关闭电源 ( )。o

如果断电通知可能被取消,您可以调用sync: ,这不会对性能产生任何不良影响。另一方面,强制安装只读通常是不可恢复的,因此仅当您承诺重新启动时才执行此操作。

对于大多数符合您的描述的设置,这是对断​​电通知的合理反应:

  1. 向受影响的进程发送自定义信号(例如 SIGUSR1 或 SIGPWR),指示它们快速提交或中止任何正在进行的事务(如果它可以帮助使下次启动时的恢复更容易)。
  2. 在预期断电之前等待部分延迟。对其进行校准,以便有足够的空间用于剩余的操作。
  3. 写入日志消息。
  4. echo u >/proc/sysrq-trigger

相关内容