【问题标题】:How to ensure data is written to file如何确保数据写入文件
【发布时间】:2018-11-06 17:24:30
【问题描述】:

我正在为带有 OS Linux 的微控制器编写日志程序。还有一个计算功能,将这些结果存储在硬盘上,并在记录仪重新启动时加载。

我的问题是,当我从当前拔下 µC 时,同时 µC 正在覆盖一些数据,被覆盖的数据可能会丢失。

那么我怎么可能覆盖一些数据,但是如果在uC覆盖的同时发生拔出,我会确保覆盖的数据或写入的数据是否一致?

编程语言是 C++,所以如果有 boost 库或者更好的 stl 类型,我会爱上的。

【问题讨论】:

    标签: c++ linux


    【解决方案1】:

    使用stream << flush; 将C++ 输出缓冲区刷新到操作系统,并使用Linux fsync() 从操作系统缓冲区刷新到磁盘。

    后者需要 Unix 文件描述符,因此您需要使用依赖于实现的方法从 C++ 流中获取 FD。见Retrieving file descriptor from a std::fstream

    为了获得额外的保护,您需要使用具有日志功能的抗故障文件系统。示例见https://www.ibm.com/developerworks/library/l-journaling-filesystems/index.html

    【讨论】:

    • 我知道这些命令,但我认为这并不能回答我的问题:如果在操作系统覆盖某些数据的同时发生电压故障会发生什么?我认为数据丢失了,但这正是我不想要的。我不想简单地追加数据,我想覆盖现有数据,因为这种特定类型的数据量太大了。我不想实现自己的电压故障安全文件覆盖类。
    • 我每5ms写一次这种类型,所以拔掉μC同时覆盖一些数据的概率非常高。
    • 您需要使用容错日志文件系统。我已经添加了一个链接到一篇关于这个的文章。
    • @JulianH 听起来您需要打开一个禁用缓冲的流,并在您的计算机上添加一个 IO 卡,该计算机配备了电池,以便在系统到来时完成 IO 操作从电压波动中备份。此外,如果您担心如您所说的覆盖 - 那么您想要实现某种类型的事务日志。一个简单的例子是 data/file/to-be-modified-portion-of-file 在写入发生之前“备份”,然后在成功 IO 操作后删除备份。
    • 您还应该研究数据库管理系统使用的技术。这对于一个简单的 SO 答案来说太宽泛了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2017-03-05
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多