1

我正在考虑如何让我的应用程序在程序或操作系统崩溃后检测部分写入的记录。由于记录只附加到文件(从不被覆盖),写入时崩溃是否保证产生比应有的更短的文件大小?即使文件以读写模式而不是附加模式打开,只要写入始终在文件末尾,这是否也能保证?这将大大简化崩溃恢复,因为将最后一条记录的预期大小和位置与实际文件大小进行比较就足以检测到部分写入。

我知道随机访问写入可以由文件系统重新排序,但我无法找到有关附加时是否会发生这种情况的信息。我想一个乱序追加将需要文件系统在(稀疏)文件的尾部创建一个“洞”,在洞之外写入块,然后填充中间的块,但我希望这种方法效率很低,以至于没有人会以这种方式实现他们的文件系统。

我想另一个问题可能是文件系统在将新块附加到文件之前更新目录条目的文件大小字段,并且操作系统在两者之间崩溃。这在实践中是否发生过?(也许是ext4?)有没有一种快速的方法来检测它?(当尝试读取根据文件大小应该存在的未写入块时会发生什么?)

是否还有其他任何事情(例如磁盘/闪存驱动器执行的写入重新排序)会妨碍使用文件大小作为检测部分追加的方式?我不希望能够在我的应用程序中弥补这种驱动技巧,但了解一下会很好。

4

1 回答 1

2

如果您想确保您永远不会丢失记录,您需要一个一致的日志或交易系统来存储您的文件。

除非您设置 O_DIRECT [您可能不想这样做],或者您使用标记来指示“这已完全提交”,否则绝对不能保证写入已经完成,这仅在文件时写入已经关了。您可以在主文件中执行此操作,或者,例如,有一个在外部记录“最后写入记录”的文件。如果您打开和关闭该文件,只要 APP 是崩溃的,它应该是安全的 - 如果操作系统崩溃 [或以其他方式突然停止 - 例如断电、磁盘拔出等],所有赌注都关闭了。

写入重新排序和写入缓存可以/可以在所有级别完成 - C 库、操作系统、文件系统模块和硬盘/控制器本身都能够重新排序写入。

于 2013-01-14T19:16:59.227 回答