安全地将值写入磁盘

Mat*_*nti 2 c++ io atomic disk

我有一个变量(固定大小).我的磁盘上有一个二进制文件,保存该变量.我的C++程序需要:

  • 从磁盘加载该变量的值
  • 更新磁盘上该变量的值

但是,我的程序运行的系统可能会出现电源故障:在某些时候,我的系统可能会随机断开电源,因此会在没有任何通知的情况下突然关闭.

因此,我需要在磁盘上完成或不完成更新操作.我试着弄清楚如何做这样的事情,但是人们永远无法确定做这种事情的最正确和最标准的方法是什么.我需要解决方案是跨平台的.因此,例如,据我所知,涉及在临时文件上写入新值然后重命名它的技巧仅适用于重命名操作是原子的POSIX兼容系统.

有全球运作的解决方案吗?我对性能感兴趣,因为该变量只需要偶尔更新一次.

Dav*_*rtz 6

  1. 在同一目录中打开一个新文件.

  2. 将变量的新值写入文件.

  3. 如果你有某种同步操作的(sync,fsync,syncfs,等等)使用它.

  4. 关闭文件.

  5. 重命名刚刚在现有文件上编写的文件.

虽然只有POSIX保证这是原子的,但您可能使用的每个操作系统都能准确理解您想要的内容,如果硬件能够实现,则将其提供给您.