文件中有我想要覆盖的区域(可能很小)。假设我调用 fseek、fwrite、fsync。有什么方法可以确保这种区域重写操作的原子性,例如我需要确定,在任何失败的情况下,该区域将只包含旧的(修改前)数据,或者只包含新的(修改后的)数据,但不是混合这个。
我想强调两件事。
首先:如果没有办法以原子方式写入任何大小的区域也没关系 - 我们可以通过将数据附加到文件中来处理它,fsync'ing,然后重写文件中的“指针”区域,然后再次 fsync。但是,如果“指针”写入不是原子的,我们仍然可以使用非法指针损坏文件。
第二:我很确定,写 1 字节区域是原子的:我不会在文件中看到我从未放在那里的任何字节。所以我们可以使用一些技巧来为地址分配两个区域并使用 1 字节开关,因此区域的重写变成了 - 追加新数据,同步,重写两个(未使用的)指针槽之一,再次同步,然后重写'switch byte ' 并再次同步。所以覆盖区域操作现在至少包含 3 个 fsync 调用。
所有这一切都会容易得多,如果我将有很长的原子写作,但我真的有吗?
有没有办法在不使用第 2 点提到的方法的情况下处理这种情况?
另一个问题是 - 写入和同步之间是否有任何顺序保证?例如,如果我调用 fseek、fwrite [1]、fseek、fwrite [2]、fsync,我是否可以在 [2] 处写入,而在 [1] 处写入 - 未提交?
这个问题适用于linux和windows操作系统,也需要任何特定的答案(例如在ubuntu版本abc ....)。