2011-07-13 7 views
2

RAIIはリソースクリーンアップに適したソリューションです。ただし、RAIIはスタックの巻き戻しに基づいています。プロセスが異常終了した場合、スタックは巻き戻されません。これはRAIIがこのような状況では動作しないことを意味します。プロセス寿命のリソースについては、何も心配する必要はありませんが、ファイル、メッセージキュー、セマフォ、共有メモリなど、ファイルシステムのライフタイムやカーネルのライフタイムリソースにとっては問題になります。RAIIとシステムリソースのクリーンアップ

信頼性の高い方法でシステム(fsおよびkernal)リソースをクリーンアップするにはどうすればよいですか?

例: 共有ファイルは "master"プロセスで作成され、 "slave"プロセスで使用されます。共有ファイルは、計画中の「マスタ」プロセスによって削除する必要があります。これを行う方法が存在するのでしょうか?

明らかに、共有ファイルを作成した後すぐにリンク解除することはできません。その場合、他のプロセスはファイルを「見る」ことができません。

答えて

1

あなたの質問に完全な答えはありません。あなたはほとんどの場合、できるだけ効果を緩和するだけです。そのため、「ジャンクを残す異常終了」はまれです。

最初に、プロセスの異常終了に対してできるだけ堅牢なプログラムを作成してください。

第2に、可能であればカーネルのメカニズムに頼ってください。共有ファイルの例では、ファイルを使用して通信する1つの「マスタ」プロセスと1つの「スレーブ」プロセスについて話しているだけの場合、両方のプロセスが開いたらすぐにファイルのリンクを解除できます。両方のプロセスが終了するまで、ファイルは存在し続け、両方のプロセスによって読み書き可能になります。その時点で、カーネルは自動的にストレージを再利用します。 (両方とも異常終了した場合でも)

もちろん、次回のサーバー起動時には、一度に1つしか存在しないと仮定して前の実行で残った迷惑メールをクリーンアップすることができます。

通常の最後の機会は、定期的に(例えば)掃引する/ tmpを実行する「クリーンアップ」プロセスを持つことです。

しかし、あなたが求めているのは根本的に難しいです。別のプロセスの異常終了を処理するプロセスは、それ自体が異常終了する可能性があります。 "誰がウォッチャーを見ますか?"

+0

ありがとうございました。プロセスは、システムリソースが他のプロセスによって使用されているかどうかを知っていますか?システムリソースの安全をどのようにクリーンアップできますか? – zhenjing

+0

リソース(ファイル、セマフォ、メッセージキューなど)が使用中であるかどうかを問い合わせる方法はわかりません。しかし、共有メモリセグメントやセマフォを含む現代のPOSIXバージョンのほとんどは、ファイルのように、使用中は「リンク解除」することができます。したがって、最後のプロセスがハンドルを閉じる(または終了すると自動的にハンドルを閉じる)とき、カーネルはリソースを自動的に再要求します。 – Nemo

+0

新しい質問をする:http://stackoverflow.com/questions/6687567/does-a-process-know-whether-a-system-resource-is-used-by-other-process-how-can-i – zhenjing

関連する問題