私は C++ を使用しており、認識している (つまり、pid であることを知っている) プロセスに対して SIGCHLD と同等のものが必要ですが、生成されませんでした。
別のプロセスが自分の子供ではない場合、またはグループやセッションに含まれていない場合に、別のプロセスの寿命をリッスン/監視/監視するための確立された設計パターンはありますか?
編集:私は特に異常終了(つまり、セグメント障害、信号など)を認識しようとしています. 問題のプロセスが受信するシグナルを盗聴したいと思います。
私は C++ を使用しており、認識している (つまり、pid であることを知っている) プロセスに対して SIGCHLD と同等のものが必要ですが、生成されませんでした。
別のプロセスが自分の子供ではない場合、またはグループやセッションに含まれていない場合に、別のプロセスの寿命をリッスン/監視/監視するための確立された設計パターンはありますか?
編集:私は特に異常終了(つまり、セグメント障害、信号など)を認識しようとしています. 問題のプロセスが受信するシグナルを盗聴したいと思います。
それ自体が特定のパターンに従っているかどうかはわかりませんが、1 つの手法は、プロセスにウォッチャーへの接続を確立させることです。ウォッチャーは接続を監視し、接続が閉じられると、プロセスがシャットダウンしたことを認識します。
監視対象のプロセスが応答しているかどうかを監視者が知りたい場合は、接続を使用して、プロセスが提供する義務があるハートビート メッセージを監視できます。
ウォッチャーが、監視対象のプロセスが進行しているかどうかを知りたい場合、ハートビート メッセージは、ウォッチャーがそれを監視できるようにする状態情報を提供できます。
オペレーティング システムが異なれば、同じ目的を達成する方法も異なる場合があります。たとえば、Linux では、ウォッチャーを使用inotify
してそのプロセスのエントリを監視し/proc
、プロセスが稼働しているか停止しているかを判断できます。BSDkqueue
にも同様の機能があります。プロセスはそのハートビート/状態を共有メモリにエクスポートでき、ウォッチャーはセマフォで時間指定待機を使用して、データが更新されているかどうかを確認できます。
プロセスがサードパーティ プログラムであり、ソースが利用できない場合は、inotify
/と同様の方法に頼るかkqueue
、最後の手段としてカーネルの状態をポーリングする必要があります (top
ユーティリティの動作方法と同様)。