写入文件时失去电源

时间:2013-05-30 11:59:22

标签: c++ corruption

我正在开发一个必须不断将信息写入存储设备的设备项目。该设备需要能够断电,但要准确保留收集到的信息,直到断电为止。

我一直在寻找能在这样的系统上断电的情况下会发生什么的答案。是否存在断电而未关闭文件的问题?数据损坏是否可能?

谢谢

2 个答案:

答案 0 :(得分:3)

“可以切断电源时安全存储数据”的整个主题很难以通用的方式解决 - 确切的解决方案将取决于确切的数据类型,存储速率数据等。

要在“电源关闭时”保留信息,数据需要存储在非易失性存储器(闪存,eeprom或电池备份RAM)中。同样,这是一个硬件解决方案。

如果您“丢失写入文件的数据”?是的,如果在系统处于写入过程中文件存储设备的电源丢失,则完全有可能无法正确写入文件。

这个问题的答案实际上取决于你需要多少自由来构建/定制硬件来应对这种情况。专为高可靠性而设计的系统将有一种方法来检测断电,并且在停电后仍然可以运行几秒钟(有时甚至更多),并且当断电发生时,它会进入“保存所有数据,并很好地关闭“模式。通常,这是通过使用不间断电源(UPS)来完成的,该电源具有报警机制,该信号表明外部电源已经消失,并且当系统接收到该信号时,开始紧急关闭。

如果您无法以任何方式连接UPS并以有序的方式关闭,那么还有其他功能,例如日记文件系统可以为您提供一组良好的数据,但不能保证能够完整数据(你需要处理你的文件格式,以便“切断数据”不会完全破坏文件 - 经典的例子是一个zip文件,它存储了“目录”(内容列表)的最后一个因此,您可以完成99.9%的文件,但缺少0.1%是解码所有内容所需的内容。

答案 1 :(得分:0)

是的,数据损坏肯定是可能的。

但是,有一些指导方针可以用纯粹的软件方式将其最小化:

  • 使用日记文件系统并将其置于最大日记帐模式(例如ext3/ext4使用data=journal,不能少。)
  • 避免使用软件缓冲区。如果您没有选择,请尽快冲洗它们。
  • 尽快同步文件系统(通过sync/syncfs/fsync系统调用,或使用sync挂载选项)。
  • 永远不会覆盖现有数据,只需将新数据附加到现有文件中。
  • 准备处理不完整的数据记录。

这样,即使丢失了数据,也只会写入最后几个字节,并且文件系统一般不会损坏。

你会注意到我假设了一个Unix-y操作系统。据我所知,Windows没有给你足够的控制来强制执行文件系统上的那种约束。