写文件过程被中断了 数据不一致 如何保证?

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

请教诸位大牛 有什么好的办法没?
...全文
385 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
小魔菇 2013-03-04
  • 打赏
  • 举报
回复
最后使用了一种方案: 允许部分数据丢失,保证磁盘数据的完整性。 并在cache中的数据完整的时候 刷到磁盘中 这样算是一种折中吧
灿烂的牛粪 2013-03-04
  • 打赏
  • 举报
回复
是否可以在每次write完之后,记录文件的偏移,重新open时使用lseek到记录的偏移位置继续写,写成功则记录新的偏移。 写文件被中断,write将会返回错误,对于错误的情况,进行根据偏移量重写这段记录。 不知这样是否满足你的要求?
grefen 2013-03-01
  • 打赏
  • 举报
回复
要加crc校验,因为硬件是有误码率的,虽然概率很低;
辰岡墨竹 2013-03-01
  • 打赏
  • 举报
回复
对,日志式系统比如ext3/4、NTFS只能保证文件系统的一致性和结构完整性,但是无法保证数据。 有的时候为了恢复文件系统日志,可能会把损坏的数据文件清空。 另外很多系统的系统组件修改重要文件的时候,都是先创建临时文件,再删掉旧文件,然后重命名的。直接去修改肯定不是很安全。
fdl19881 2013-02-28
  • 打赏
  • 举报
回复
引用 11 楼 luo6620378xu 的回复:
引用 9 楼 yellow_hill 的回复:引用 4 楼 eclipse_2 的回复:引用 2 楼 yellow_hill 的回复:分块写,每块校验,错了重写 分块写 加log 校验 错了log恢复 是这个意思吧 但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂 楼上已经解释了,可以考虑crc校验,临时文件我觉得也是办法 至于内……
ext4 这类文件系统是日志式的,写文件时都会先写日志。。这样即使掉电了,文件系统的一致性仍然能够恢复。当然还没写入的数据肯定是丢失了。
luo6620378xu 2013-02-28
  • 打赏
  • 举报
回复
引用 9 楼 yellow_hill 的回复:
引用 4 楼 eclipse_2 的回复:引用 2 楼 yellow_hill 的回复:分块写,每块校验,错了重写 分块写 加log 校验 错了log恢复 是这个意思吧 但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂 楼上已经解释了,可以考虑crc校验,临时文件我觉得也是办法 至于内核的机制,这点没研究过
额,就算是内核,如果是突然掉电,数据也可能会丢失的。
小魔菇 2013-02-28
  • 打赏
  • 举报
回复
引用 9 楼 yellow_hill 的回复:
引用 4 楼 eclipse_2 的回复:引用 2 楼 yellow_hill 的回复:分块写,每块校验,错了重写 分块写 加log 校验 错了log恢复 是这个意思吧 但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂 楼上已经解释了,可以考虑crc校验,临时文件我觉得也是办法 至于内核的机制,这点没研究过
我也不知道 内核机制的具体方案 我觉得内核机制可能更多的从数据的一致性角度考虑 丢失数据是不可避免的 只要数据是OK的就行
Franklin 2013-02-28
  • 打赏
  • 举报
回复
引用 4 楼 eclipse_2 的回复:
引用 2 楼 yellow_hill 的回复:分块写,每块校验,错了重写 分块写 加log 校验 错了log恢复 是这个意思吧 但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂
楼上已经解释了,可以考虑crc校验,临时文件我觉得也是办法 至于内核的机制,这点没研究过
小魔菇 2013-02-28
  • 打赏
  • 举报
回复
引用 6 楼 qq120848369 的回复:
但如果的确是要求一直操作一个文件, 那么我觉得自定义格式, 在每一个包的头尾加上magicnumber来做校验就差不多了,不需要计算crc之类的。
引用 7 楼 luo6620378xu 的回复:
引用 4 楼 eclipse_2 的回复:引用 2 楼 yellow_hill 的回复:分块写,每块校验,错了重写 分块写 加log 校验 错了log恢复 是这个意思吧 但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂 记得文件编辑时不是正常退出了话,系统会产生一个XXX.swp文件。 这应该就是qq120848369提到的临……
整个临时文件倒是最简单的办法 可以试试
luo6620378xu 2013-02-28
  • 打赏
  • 举报
回复
引用 4 楼 eclipse_2 的回复:
引用 2 楼 yellow_hill 的回复:分块写,每块校验,错了重写 分块写 加log 校验 错了log恢复 是这个意思吧 但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂
记得文件编辑时不是正常退出了话,系统会产生一个XXX.swp文件。 这应该就是qq120848369提到的临时文件概念。
qq120848369 2013-02-28
  • 打赏
  • 举报
回复
但如果的确是要求一直操作一个文件, 那么我觉得自定义格式, 在每一个包的头尾加上magicnumber来做校验就差不多了,不需要计算crc之类的。
qq120848369 2013-02-28
  • 打赏
  • 举报
回复
你的需求肯定要写临时文件的, 最后再move回去. 你断电肯定是断在写临时文件上, 不会写坏原文件, 数据该丢还是要丢的。
小魔菇 2013-02-28
  • 打赏
  • 举报
回复
引用 2 楼 yellow_hill 的回复:
分块写,每块校验,错了重写
分块写 加log 校验 错了log恢复 是这个意思吧 但是linux内核中的数据是如何保证的?是这样做的吗?好像没有这么复杂
小魔菇 2013-02-28
  • 打赏
  • 举报
回复
引用 1 楼 qq120848369 的回复:
断电时时刻刻啊,内核都没法保证不对数据或者数据不错。。
不知道内核中是如何恢复掉电数据的? 通过日志?
Franklin 2013-02-28
  • 打赏
  • 举报
回复
分块写,每块校验,错了重写
qq120848369 2013-02-28
  • 打赏
  • 举报
回复
断电时时刻刻啊,内核都没法保证不对数据或者数据不错。。

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧