いくつかのステータス情報を含むファイルを作成し、時々更新するライターが 1 つあります。リーダーは lua で実装されているため (私は のみ取得しましたio.open
)、おそらく bash ( cat
, grep
, なんでも) で実装されています。リーダーがファイルへのオープン ハンドルを持っている間にステータス情報が更新された場合 (つまり、完全なファイルの書き換え) が発生するとどうなるか心配です。また、書き込み/読み取り操作が 4KB 未満の場合、それはアトミックであることも読みました。ステータス情報はそのような次元にうまく収まるので、それは私にとってはまったく問題ありません。この仮定を立てることができますか?
2 に答える
読み取りまたは書き込みは、パイプに対してのみ4Kバイト未満でアトミックであり、ディスクファイルに対してはアトミックではありません(アトミック粒度はファイルシステムのブロックサイズであり、通常は512バイトです)。
実際には、そのような問題について悩むことを避けることができ(ステータスファイルが512バイト未満であると仮定)、ライターがそのファイルをすばやく開いて書き込んでいる場合(特に、open(2)を回避している場合)-ファイルを作成し、開いたファイルハンドルを長時間(数秒)保持してから、write(2)-後で-一度、小さな文字列-をその中に入れます)、わざわざする必要はありません。
あなたが妄想的であるが、読者が(のようにgrep
)ファイルを開いてすばやく読んでいると仮定する場合は、一時ファイルに書き込み、書き込み時に名前を変更(およびclose(2) -ed)することができます。
Duckが提案したように、リーダーとライターの両方でファイルをロックすることも解決策です。
私は間違っているかもしれません。その場合、誰かが私を訂正してくれますが、外部の読者はファイルが同時に更新されているかどうかに注意を払うつもりはないと思います。彼らはそこにあるものは何でも印刷(またはおそらくeofまたはエラーアウト)しようとしています。
いずれにせよ、混乱全体を避けて、ファイルロックだけを使用してみませんか。ライターflock
(または同様のもの)とリーダーにロックを確認してもらいます。彼らがロックを取得した場合、彼らは彼らが読んでも大丈夫であることを知っています。