在linux上使用文件作为IPC

时间:2012-08-24 18:58:15

标签: linux file-io ipc

我有一个编写器,它创建并有时使用某些状态信息更新文件。读者是以lua(所以我只得到io.open)并且可能是bash(catgrep,无论如何)实现的。我担心如果更新状态信息(这意味着完整的文件重写)会发生什么,而读者有一个打开的文件句柄:会发生什么? I have also read如果写/读操作低于4KB,则它是原子的:这对我来说非常好,因为状态信息可以很好地适应这种维度。我能做出这个假设吗?

2 个答案:

答案 0 :(得分:2)

对于管道而言,读取或写入仅为4K字节,而不是磁盘文件(原子粒度可能是文件系统块大小,通常为512字节)。

在实践中,你可以避免烦恼这些问题(假设你的状态文件是例如小于512字节),并且我相信如果作者正在快速打开和写入该文件(特别是,如果你避免{{3} - 一个文件并保持打开的文件句柄很长时间 - 很多秒 - 然后open(2) - 稍后 - 一个小字符串 - 在里面),你不需要打扰。

如果你是偏执狂,但是假设读者(如grep)打开一个文件并快速阅读,你可以写一个临时文件并write(2)编写它(和rename(2) - ed)in totality。

作为Duck close(2),将文件锁定在读者和编写者中也是一种解决方案。

答案 1 :(得分:1)

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

在任何情况下,为什么不避免整个混乱,只是使用文件锁。让作者flock(或类似)和读者检查锁定。如果他们得到锁,他们就知道他们可以阅读。