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

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

请教诸位大牛 有什么好的办法没?
...全文
323 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
  • 打赏
  • 举报
回复
断电时时刻刻啊,内核都没法保证不对数据或者数据不错。。
本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与文件安全性 5.4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5.6 文件与读 5.7 其他文件操作 5.8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数sys—listen()——设定server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备文件系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构中的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构中的中断机制 9.5SMP结构中的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶段) 10.3系统初始化(第二阶段) 10.4系统初始化(第三阶段) 10.5系统的关闭和重引导

23,120

社区成员

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

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