別のプロセスがファイルの内容を書き換えている間に私がファイルを読み込んだとしましょう。出力は予測可能ですか?どうしたの?
答え1
作家が何をするかによって異なります。
作成者が既存のファイルを上書きする場合、作成者がリーダー(存在する場合)を上回ると、リーダーは新しいコンテンツを表示します。著者と読者が進行する速度が異なる場合、読者は古い内容と新しい内容を交互に見ることができる。
ライターが書き込みを開始する前にファイルを切り捨てると、リーダーはその時点でファイルの最後に実行されます。
作成者が新しいファイルを作成し、新しいファイルを古い名前に移動すると、リーダーは古いファイルから読み続けます。開いているファイルが移動または削除されると、そのファイルを開いたプロセスは同じファイルを読み続けます。ファイルが削除されると、最後のプロセスがファイルを閉じるまで実際にディスクに残ります(ただし、再度開くことはできません)。
Unixシステムはしばしば強制しないロックする。アプリケーションがライターとリーダーのコンポーネントが互いに干渉しないようにする場合は、開発者は適切なロックを使用する必要があります。カーネルによって開かれたファイルがユーザーアプリケーションによって記録されないように保護できるいくつかの例外があります。リング- マウントされたファイルシステムイメージまたは一部のUNIXバリアントで実行される実行可能ファイル。
答え2
これは典型的な競争条件であるため、定義上結果を予測することはできません。
それは何に依存します
fopen(3)
またはopen(2)
書き込みモード、- 作成者が出力をバッファリングするかどうかと方法
- 読者が文書を読む方法、
- 読者と作家の速度差、
- 読み取り開始と書き込み開始の時間差。
- もちろん、最新のマルチコアシステムでは、プロセススケジューリングなどの他のサブ要素によって状況がより複雑になります。
ファイルの書き換え中にファイルを読み取ることができる必要がある場合は、作成者にファイルの一時コピーを作成して変更し、元のファイルにコピーするように依頼できます。rsync
たとえば、このようにします。これを達成する方法はいくつかありますが、無料のランチはありません。各方法には独自の欠点と意味があります。
答え3
以前の回答者はこれより包括的な説明をしましたが、以下は確かにうまくいき、彼が望むことをほぼ正確に実行するトリックです。
$ tail -f <filename>
ファイルの作成中にファイルの終わりが表示されます。たとえば、STDERRをファイルにパイプしたいが、それでも他の端末ウィンドウに表示できる場合に便利です。