a
読み取るためにファイルを開くとしましょう。アプリケーション(このように呼び出す)がランダムな間隔でファイルに書き込まれるとaWriter
どうなりますか?開いて読もうとすると、a
間違ったファイルの内容を受け取ることがありますか?同時に aWriter
新しい行を作成しています。ファイルはどのようになり、ファイルを読み取った内容はどうなりますか?
別の状況。b
100行のテキストを含むファイルがあるとします。bWriter
ランダムに書くアプリケーションもあります。b
ファイルの最初の80行を削除したいですb
。bWriter
文を書きたいと仮定すると、開いb
てからも書くことができますか?あきらめて書き込み内容を失うでしょうか?
Syslog関連のPerlスクリプトを書いているので、この質問をします。 Syslogにすべてのログをファイルに書き込むように指示し、スクリプトは(5分ごとに)ファイルの内容を読み取り、別の操作を実行し、ファイル内のすべての行を削除して前の行をアーカイブに書き込む必要があります。私はこのファイルをスクリプトとログの最後の場所の間の中間段階として使用します。
誰がそれが正確にどのように機能するかについての洞察を与えることができますか?
答え1
両方のプロセスが書き込み用に同じファイルハンドルを開くことができます。いつものように、最後に処刑する人が勝ちます。
あるプロセスがファイルハンドルを開き、別のプロセスがここに80行を書き込むと、最初のプロセスのメモリバッファには80行がありません。その後、バッファがファイルハンドルに書き込まれると、ファイルの内容は単に2番目のメモリバッファの内容になります。
ところで、最近、多くのプログラムは、元のファイルの内容が最後に開かれてから変更されたことを検出します。一部は書き込みを拒否し、一部はバッファを再ロードするように求められます。いくつかは他のことをするかもしれません。すべてのプログラムは、正しいことを行うことを確認する責任があります。カーネル/ファイルシステムは気にせず、80行がないメモリバッファ正しいコピー。
これで、ホームディレクトリにあるいくつかのテキストファイルやドキュメントだけでなく、データベースなどのより重要なものであれば、ファイルロックを使用する可能性が高くなります(ロックを言わない、または使用しないという意味でもありますvim
)gedit
。データベースには独自の内部ロック機構があります。
UNIXスタイルのプラットフォームの一般的なアイデアは、ファイルハンドルの書き込みに対してコラボレーションを実行することです。ロックは、セキュリティ制御メカニズム(権限/ ACLの目的)ではなく、データ整合性メカニズムです。データを書き込む2つのプログラムは通常、データが正しく書き込まれていることを確認したいので、互いのロックを尊重することは両方の当事者にとって有益です。カーネル/ファイルシステムはロックについて警告しますが、まだ各プロセスが最善であると思うタスクを実行できるようにします。ただし、Linuxはインストールオプションでロックを適用します(ファイルシステムのサポートが必要な場合がありますがわかりません)。
ロックの詳細をご覧ください。Wikipediaファイルのロック記事。