C++ C++;:如何正确实施文件防断电?

C++ C++;:如何正确实施文件防断电?,c++,linux,fsync,C++,Linux,Fsync,我有一个linux嵌入式环境 这里我有两个场景: A: 打开并写入一个临时文件 将临时文件重命名为原始文件 功率损耗 结果:重新启动后,我得到的是: 0大小的原始文件,没有临时文件 B: 打开并写入一个临时文件 FSYNC临时文件 将临时文件重命名为原始文件 功率损耗 结果:重新启动后 保留原始文件的原始内容,但未实施 0大小的临时文件 如您所见,这两种情况之间唯一的区别是临时文件的fsync,而不是原始文件。在这两种情况下,我都没有同步原始文件 那么,为什么在场景B中保留原始文

我有一个linux嵌入式环境

这里我有两个场景:

A:

  • 打开并写入一个临时文件
  • 将临时文件重命名为原始文件
  • 功率损耗
  • 结果:重新启动后,我得到的是:

    • 0大小的原始文件,没有临时文件
    B:

  • 打开并写入一个临时文件

  • FSYNC临时文件

  • 将临时文件重命名为原始文件

  • 功率损耗

  • 结果:重新启动后

    • 保留原始文件的原始内容,但未实施
    • 0大小的临时文件
    如您所见,这两种情况之间唯一的区别是临时文件的fsync,而不是原始文件。在这两种情况下,我都没有同步原始文件

    那么,为什么在场景B中保留原始文件的原始内容

    从原始文件的角度来看,更改是通过重命名非fsynced文件和fsynced文件来实现的

    这如何保持原始内容

    编辑:

    实现原始文件的此场景也无法安全实现原始文件:

  • 打开并写入一个临时文件

  • FSYNC临时文件

  • 将临时文件重命名为原始文件

  • Fsync原始文件的目录

  • 功率损耗

  • 结果:

    0大小的原始文件


    那么,我该怎么做呢?

    通常,如果你想避免断电,你可以使用日志记录。这意味着(广义地说)你存储了你想写的东西,你在哪里写,当它被成功地写出来时,你从日志中删除它(至少在逻辑上是这样)。如果发生重大故障(断电或其他系统崩溃),请阅读日志并应用仍然存在的任何更改。许多文件系统都有启用它的选项,在日志文件系统上,您可以预期重命名是原子的,并且不会断电:文件将以其以前的名称或新名称存在

    因此,常见的工作流程是:

    • 将旧文件重命名为备份名称
    • 将新文件写入其最终名称
    • 关闭新文件以确保它将驻留在磁盘上
    • 删除备份文件(或为其指定其他名称)
    在断电(或任何其他崩溃情况)的情况下,在下次重新启动时,事情很简单:

    • 如果没有备份文件,则该文件处于稳定状态
    • 如果存在备份文件,它将包含文件的最后一个稳定状态:如果存在,则必须删除该文件,并且必须将备份重命名为正常名称

    您是否排除了任何其他因素?你如何计算停电时间?您使用什么文件系统?文件系统是ubifs。我只是简单地断开电源线。请发一些代码。请发一封电子邮件
    我有一个linux嵌入式环境。
    这里的“嵌入式环境”是什么意思?什么环境?你在研究什么架构<代码>将临时文件重命名为原始文件。是否调用
    重命名<代码>文件系统是ubifs
    装载选项是什么?上面还有其他东西吗?您是否在与目标文件相同的目录中创建TermSporary文件?你在哪里创建它?怎么用?