这个相关问题无法解决我的确切问题,所以我正在写一个类似的问题。
我的场景如下:一个程序(由 wine 运行)写入一个大小约为 10-500 KB 的文件。每次写入事件都会发生大约 1 KB 的添加(行添加到文件末尾,不存在其他写入方法),写入之间的间隔从微秒到 240 分钟。 (一般来说,写入的间隔在3到10分钟之间,但上述时间边界是理论上可能的限制)。
我无法修改这个间隔,从用户的角度来看它是随机的。写入间隔发生变化,因此有可能A B C D写入事件如下:AB 60 分钟;公元前5秒; CD 357.4 秒等等。
我想大约每 25 到 30 分钟复制一次文件,以便在外部进行编辑(当然是自动的)。
最好的解决方案是什么保证不会出现竞争条件吗?我不想编写计时算法,但是,如果有必要,我可以这样做。另外,复制-外部编辑的间隔可以扩大到1天,不能再多了。 Wine 不允许我重定向输出。
$ grep sda4 /etc/mtab
/dev/sda4 /foo xfs rw,relatime,attr2,delaylog,noquota 0 0
更新
我无法配合写入过程,并且相关文件是严格格式的纯文本文件。
答案1
没有任何东西可以保证您在所有情况下都不会复制“部分写入”(从应用程序的角度来看),除了以下任一情况:
- 与其他进程协作(即告诉它刷新并停止/重新启动其写入的方法)
- 使用“真正的”事务(数据库)系统,允许您拍摄一致的快照/备份/转储
有时,如果相关文件的格式严格,则可以解决此问题。如果在非原子写入正在进行时复制文件,则最后一条记录将不一致或不完整,并且您的处理应用程序可以检测到这一点,或者干脆系统地忽略最后一条记录。
(即使应用程序始终通过单个write
调用或等效方法写入其记录,应用程序也可能在写入调用期间被中断,并且实际上只处理了部分写入。)