2017-09-19 1 views

答えて

3

UNIXでは、並行読み書きが可能です。他の人がファイルを追加している間は、ファイルを読むのは完全に安全です。

もちろん、読み取り行為がファイルの終わりに達している間に追加行為が未完了である場合、この読み取り者は不完全なバージョンを取得します(例:新しいログエントリの一部のみがファイル)。しかし、技術的には、このファイルは実際に読み取られている(例えば、コピーされている)状態であったので、が正しいである。

EDIT

それによりがあります。

ライタープロセスにオープンファイルハンドルがある場合、このプロセスがオープンファイルハンドルを保持している限り、ファイルはディスクに残ります。

ファイル(rm(1),unlink(2))を削除すると、そのファイルはそのディレクトリからのみ削除されます。それはディスク上にとどまり、ライター(およびオープンファイルハンドルを持つ他のすべての人)は、すでに削除されたファイルの内容を読み取ることができます。最後のプロセスがファイルハンドルを閉じると、ファイルの内容はディスク上で解放されます。

これは、プロセスがディスクをいっぱいにする大きなログファイルを書き込むと、問題になることがあります。ログファイルにファイルハンドルを保持して開いている場合、システム管理者はrmを使用してこのディスク容量を解放することはできません。 典型的なアプローチは、プロセスを終了させることです。したがって、プロセスとして、ログに書き込んだ後にログファイルのファイルハンドルを閉じる(または少なくとも時々閉じると再オープンする)ことをお勧めします。

以上あります:

プロセスは、ログファイルのオープンファイルハンドルを持っている場合は、このファイルハンドル位置が含まれています。ログファイルが空になった場合(追加フラグを使用しない書き込みでは: > filepath)、ファイルの内容は実際にディスクから削除されます(truncate(1)truncate(2)open(2))。開いているファイルハンドルを持つプロセスがこのファイルに書き込んでいる場合は、古い位置に書き込みます。 g。数メガバイトの位置にある。これを空のファイルにすると、空白がゼロで埋められます。

スパースファイルを作成できる場合(通常はUnixファイルシステムで可能です)、これは実際の問題ではありません。それ以外の場合は、ディスクをすぐにもう一度いっぱいにします。しかし、いずれにせよ、それは非常に混乱する可能性があります。

+0

詳細な対応をありがとうございます。オープンファイルはLinux ABIの一部ですか?そして、C/Pythonの 'open'メソッドによって抽象化されたものはありますか? – Greg

+1

上記のオープンファイルハンドルの処理はUnixの一部であり、Linuxの一部でもあります。 C/Pythonでは 'open'によって抽象化されていません。 Pythonプロセスが(open()を使って作成された)オープンファイルハンドルを保持している場合、結果は説明された結果になります。実際には、ファイルを作成するための確立されたパターンです( 'open( '/ tmp/foo.tmp'、 'wb')')。そしてそれを一度にディスクから削除します( 'unlink( '/ tmp/foo.tmp ') ')を実行し、開いているハンドルを保持して、書き込みおよび読み取りを行う一時ファイルを作成し、プロセスが終了するとすぐにディスクから自動的に削除されます。 – Alfe

関連する問題