2012-08-24 20 views
0

我有一位作家創建並有時用某些狀態信息更新文件。讀者在盧阿(所以我只得到io.open)和可能bash(catgrep,無論)實施。我擔心如果狀態信息更新(這意味着一個完整的文件重寫)會發生什麼,而讀者有一個打開的文件句柄:會發生什麼? I have also read,如果寫入/讀取操作低於4KB,這是原子性的:這對我來說是非常好的,因爲狀態信息可以很好地適合這樣的維度。我可以做這個假設嗎?在linux上使用文件作爲IPC

回答

2

對於管道而言,讀取或寫入是在4Kbytes以下的原子,而不是磁盤文件(原子粒度可能是文件系統塊大小,通常爲512字節)。

在實踐中你能避免打擾對這些問題(假設你的身份文件如小於512字節),而我認爲,如果作家是開放和快速編寫文件(特別是如果你避開open(2) -ing一個文件,並保持打開的文件句柄很長一段時間 - 然後是write(2)-稍後 - 一個小的字符串 - 在裏面),你不需要打擾。

如果你是偏執狂,但不要假設讀者(如grep)打開文件,快速閱讀它,你可以寫一個臨時文件和rename(2)在整體寫入時(和close(2) -ed)-ing它。

作爲Duck suggested,鎖定讀寫器中的文件也是一個解決方案。

+0

還考慮到[這在移動文件時處理打開](http://stackoverflow.com/questions/2028874/what-happens-to-an-open-file-handler-on-linux-if-the -pointed-file-gets-moved-de),我相信mv解決方案是最好的。 –

1

我可能會誤解,在這種情況下,有人會糾正我,但我不認爲外部讀者將會注意文件是否被同時更新。他們打算打印(或者可能是eof或錯誤)任何地方。

在任何情況下,爲什麼不避免整個混亂,只是使用文件鎖定。讓作者flock(或類似)和讀者檢查鎖。如果他們得到鎖,他們知道他們可以閱讀。