2011-01-27 14 views
3

私は問題がある、私はいくつかのプロセスを監視し、誰かが死んだ場合は、それを再起動するコントロール実行可能ファイルがあります。ウィンドウでは、WaitFOrMultipleObjectを使って処理しています。ここで、プロセスハンドルはハンドルの配列で渡されます。 WaitForMultipleObjectによって認識されるプロセスがなくなると、プロセスの寿命を監視する方法

これをLinuxで実装する必要があります。それをどうやってやるの? Waitは1つのプロセスIDに対してのみ動作し、複数のプロセスを監視する必要があります。

+0

も参照してください:http://stackoverflow.com/questions/4126401/designing-a-monitor-process-for-monitoring-and-restarting-processes – ninjalj

答えて

1

あなたが探しているような音はprocess groupsです。呼び出しのpidの値として-pidgroup(つまり、pidグループの負の値)を使用するプロセスグループの場合はwaitpid(2)、子プロセスを待機する場合は-1となります。

1

これは、Unixが倒れる場所の1つです。これは、select(これはUnix相当のWaitForMultipleObjects)に渡すことができる、プロセスのファイル記述子の概念を持つべきです。しかしそれはしません。

代わりにSIGCHLDのハンドラをインストールしてください。このハンドラでは、wait4またはwaitpid(いずれか便利ですが、プレーンwaitを使用しようとしていません。オプションパラメータが必要です)を呼び出して、0を返すまでWNOHANGフラグを設定してループします。そのPIDと終了状態を構造体に書き込み、その構造体をパイプに書き込みます。メインイベントループのパイプから読み込み、構造を引き出して適切な処置を講じます。あなたのプログラムに何もしなければならないし、無限ループでsigsuspendを呼び出すことからなる "main loop"がない限り、シグナルハンドラから子を再生成(またはメモリを割り当てるか、何か)しないでください。

+0

これは非常にきれいに達成することができますいずれかの子(-1)かproessグループのメンバー(-pgid)のいずれかで待機します。信号ハンドラやビジー待ちの必要はありません。 – Flexo

+0

これを行うとループで呼び出す必要があります。プログラムに何か他のことがある場合は、 'SIGCHLD'に代わるものはありません。プログラムに何もする必要がなければ、 'sigsuspend'を使わずに' waitpid'をブロックすることができます。 – zwol

+0

本当にselect()を呼び出すことができるものが必要なら、signalfd()を使用してそのようにすることができます。 – Flexo

関連する問題