システムをテストしようとしていますが、子プロセスがハングする状態をエミュレートしたいと考えています。これを行うために、子プロセスを GDB にアタッチして中断しようとしています。しかし、物事は期待通りに進んでいないようです。
また、同じように、生成された子プロセスが進行中でなくハングしていることをどのように知ることができますか?
システムをテストしようとしていますが、子プロセスがハングする状態をエミュレートしたいと考えています。これを行うために、子プロセスを GDB にアタッチして中断しようとしています。しかし、物事は期待通りに進んでいないようです。
また、同じように、生成された子プロセスが進行中でなくハングしていることをどのように知ることができますか?
SIGSTOP を使用して子プロセスをハングアップさせることができますが、これは、子プロセスが無限ループに陥ったり、不適切な条件付き待機になったりすることとは明らかに異なります。それでも、テストには十分に近い可能性があります。
子プロセスがハングしていないことを確認するには、親プロセスにハートビートを送信します (これには何らかの通信チャネルが必要です - 少なくとも stdin/stdout が必要です)。その後、ハートビート メッセージを数回送信できなかった場合、子プロセスはハングしたことになります。
子プロセスは、フォークの前に作成されたすべてのパイプを継承します。これを使用して、子供を「吊るす」ことと、いつ続行するかを知らせることができます。子プロセスにパイプでブロッキング読み取りを試行させることができ、親プロセスが何かを書き込むまでブロック (ハング) します。
Douglass の言及などのシグナルを使用することもできます。OS に基本的な停止/継続を行わせるか、シグナル ハンドラーを実装してより複雑なこと (無限ループに入るなど) を行うことができます。
これら両方の例は、プロセス制御、シグナル処理、パイプなどに関する大量の追加情報とともに、 Unix Programming FAQで見つけることができます...
/proc を調べて、ハングしているかどうかを判断してみてください。/proc/<child-pid>/stat を読み取ると、現在の状態、プロセスがスケジュールされているユーザー/カーネル時間、現在のスタックおよび命令ポインターなど、多くの低レベルのプロセス情報を取得できます。 ..これを組み合わせて使用すると、プロセスがハングしているかどうかを判断できます。/proc/<pid>/stat の詳細については、proc(5)の man ページを参照してください。