日期:2014-05-16  浏览次数:20839 次

写文件过程被中断了 数据不一致 如何保证?
有一个文件 很大 
进程不断的往里面写 
每次写的过程:先读文件 ,然后修改,然后写文件
突然被中断了 写过程也被中断了,这样数据就不一致了 
建书 有没有什么好的办法来保证数据的一致性?
open的时候加o_sync这个flag也没有用 这个还是有个时间差 没办法保证
o_direct对文件读写块有限制,需要对程序做过多的修改

请教诸位大牛 有什么好的办法没?

------解决方案--------------------
断电时时刻刻啊,内核都没法保证不对数据或者数据不错。。
------解决方案--------------------
分块写,每块校验,错了重写
------解决方案--------------------
你的需求肯定要写临时文件的, 最后再move回去.

你断电肯定是断在写临时文件上, 不会写坏原文件, 数据该丢还是要丢的。


------解决方案--------------------
但如果的确是要求一直操作一个文件, 那么我觉得自定义格式, 在每一个包的头尾加上magicnumber来做校验就差不多了,不需要计算crc之类的。
------解决方案--------------------
引用:
引用:分块写,每块校验,错了重写

分块写 加log 校验 错了log恢复 
是这个意思吧

但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂


记得文件编辑时不是正常退出了话,系统会产生一个XXX.swp文件。
这应该就是qq120848369提到的临时文件概念。
------解决方案--------------------
引用:
引用:分块写,每块校验,错了重写

分块写 加log 校验 错了log恢复 
是这个意思吧

但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂

楼上已经解释了,可以考虑crc校验,临时文件我觉得也是办法
至于内核的机制,这点没研究过
------解决方案--------------------
对,日志式系统比如ext3/4、NTFS只能保证文件系统的一致性和结构完整性,但是无法保证数据。
有的时候为了恢复文件系统日志,可能会把损坏的数据文件清空。
另外很多系统的系统组件修改重要文件的时候,都是先创建临时文件,再删掉旧文件,然后重命名的。直接去修改肯定不是很安全。