许多常见的文件系统不提供原子操作,但在某些情况下以原子方式编写文件非常重要。我试图找到解决这个问题的方法。
我做了以下假设:
这会产生以下问题:在编写文件时,程序可能会被中断,文件只剩下要写入的部分内容。
我建议采用以下流程:
新和备份文件可与原始文件区分开(例如,它们可以采用不同的前缀,也可以位于单独的目录中在同一卷上)。同时,他们的名字应该直接映射到相应的 Original (例如,只需使用相同的文件名)。
然而,这并不会使操作成为原子。该过程可以中断步骤1,2,3或4:
使用之前的假设2和3,程序必须在崩溃后重新启动。在启动过程中,它应该执行这些恢复检查:
恢复过程本身只使用原子操作,只会在中断后从中断处继续。
我相信这个想法确保了单个程序的原子写入。这些问题仍然存在:
这些问题(以前的假设排除在外)可以通过使用策略解决(例如,检查其他实例,并拒绝对其他用户的目录访问)。
最后,我的问题:这是否有意义,或者是否存在缺陷?是否有任何问题妨碍这种方法在实践中使用?
答案 0 :(得分:4)
您应该假设只有一件事,重命名文件是原子操作
因此,以下步骤将确保更正(至少在像OS这样的unix上)
这样,如果应用程序在重新启动时崩溃,则无需额外代码即可获取旧内容或新内容。
答案 1 :(得分:3)
您的步骤可以进一步简化:
启动时:
我已经在管理配置文件时使用过它,并且从未遇到过这个过程中的问题。