1

我有一位作家,它创建并有时更新带有一些状态信息的文件。阅读器是在 lua 中实现的(所以我只有io.open),可能还有 bash (cat,grep等)。我担心如果更新状态信息(这意味着完整的文件重写)而读者拥有文件的打开句柄会发生什么:会发生什么?我还读到如果写/读操作低于 4KB,它是原子的:这对我来说非常好,因为状态信息可以很好地适应这样的维度。我可以做这个假设吗?

4

2 回答 2

2

读取或写入在 4Kbytes 以下是原子的,仅适用于管道,而不适用于磁盘文件(原子粒度可能是文件系统块大小,通常为 512 字节)。

在实践中,您可以避免担心此类问题(假设您的状态文件例如小于 512 字节),并且我相信如果作者正在快速打开和写入该文件(特别是,如果您避免使用open(2) -ing a文件并保持打开的文件句柄很长一段时间 - 很多秒 - 然后write(2) -稍后 - 一次,一个小字符串 - 在里面),你不需要打扰。

如果你是偏执狂,但假设读者(喜欢grep)打开一个文件并快速阅读它,你可以写入一个临时文件并rename(2)写入时(和close(2) -ed) .

正如 Duck 所建议的那样,将文件锁定在读取器和写入器中也是一种解决方案。

于 2012-08-24T19:26:35.883 回答
1

我可能弄错了,在这种情况下有人会纠正我,但我认为外部读者不会关注文件是否正在同时更新。他们将打印(或者可能是 eof 或错误输出)那里的任何内容。

无论如何,为什么不避免整个混乱而只使用文件锁。让作者flock(或类似人员)和读者检查锁。如果他们得到锁,他们就知道他们可以阅读。

于 2012-08-24T19:26:44.073 回答