私は、クライアント コードに統合されるライブラリ (C++) に取り組んでいます。この lib はいくつかの子プロセスを生成し、(何らかの理由で) 死ぬとすぐにそれらを再生成するためにそれらを監視する必要があります。これらの子プロセスを生成するには、vfork と exec を使用する必要があります。
シグナル ハンドラーを使用して SIGCHLD を処理し、waitpid を呼び出して、どの子が死んでいるかを検出する必要があることはわかっています。ただし、ユーザー コードは同じ考え方を使用して、独自の子プロセスを処理している可能性があります。
waitpid を呼び出すと、停止した可能性のあるすべての子プロセスに関する情報が取得されます (私のものかどうかに関係なく)。死にゆくプロセスが私のものなら、問題ありません... 幸せなケースです。ただし、それがユーザーからのものである場合、既に waitpid を呼び出しているため、ユーザーはそれに関する情報を取得していません。
どうすればそれを回避できますか?
私の最初のアイデアは、プロセス グループを使用することです。初めて fork すると、子 pid を取得して、プロセス グループ ID として保存します。私が作成する各子は、そのグループをこの pid に設定します。皆さん、それは良い選択だと思いますか? (私はそれに問題があります)。
私の 2 番目のアイデアは、シグナル ハンドラーを元のハンドラーにリセットする (または単に呼び出す) ことです。シグナルを再発生させると、元のハンドラーがそれを取得できるようになります。その後、シグナルハンドラを再インストールする必要があります。それは良い選択でしょうか?
3 つ目の選択肢は、INFO (拡張シグナル ハンドラー) を使用することです。瀕死のプロセスの pid は info 構造体で利用できると思います。これが私の子供の 1 人なら、そのために waitpid を呼び出しますが、それで問題ありません。それが私のものでない場合は、元のシグナルハンドラーを呼び出します。それは良い選択でしょうか?
最後に 1 つだけ補足質問をします。元のシグナル ハンドラーを呼び出せるようにするには、常にそれらを復元してシグナルを再生成する必要がありますか、それとも関数呼び出しとして呼び出すだけで十分ですか?
どうもありがとうございました。