我有一个编写器,它创建并有时使用某些状态信息更新文件。读者是以lua(所以我只得到io.open
)并且可能是bash(cat
,grep
,无论如何)实现的。我担心如果更新状态信息(这意味着完整的文件重写)会发生什么,而读者有一个打开的文件句柄:会发生什么? I have also read如果写/读操作低于4KB,则它是原子的:这对我来说非常好,因为状态信息可以很好地适应这种维度。我能做出这个假设吗?
答案 0 :(得分:2)
对于管道而言,读取或写入仅为4K字节,而不是磁盘文件(原子粒度可能是文件系统块大小,通常为512字节)。
在实践中,你可以避免烦恼这些问题(假设你的状态文件是例如小于512字节),并且我相信如果作者正在快速打开和写入该文件(特别是,如果你避免{{3} - 一个文件并保持打开的文件句柄很长时间 - 很多秒 - 然后open(2) - 稍后 - 一个小字符串 - 在里面),你不需要打扰。
如果你是偏执狂,但是假设读者(如grep
)打开一个文件并快速阅读,你可以写一个临时文件并write(2)编写它(和rename(2) - ed)in totality。
作为Duck close(2),将文件锁定在读者和编写者中也是一种解决方案。
答案 1 :(得分:1)
我可能会弄错,在这种情况下有人会纠正我,但我不认为外部读者会关注文件是否同时更新。他们将打印(或可能是eof或错误)无论那里是什么。
在任何情况下,为什么不避免整个混乱,只是使用文件锁。让作者flock
(或类似)和读者检查锁定。如果他们得到锁,他们就知道他们可以阅读。