フォークする Perl スクリプトがあります。
各フォークは外部プログラムを実行し、出力を解析して、出力を保存可能なファイルに変換します。
次に、Storable ファイルが親によって読み込まれ、各子からの合計データが分析されてから、前のフォークの繰り返しに進むか、親が停止します。
一部の子がまだ外部プログラムを実行しているときに ^C を発行すると、正確にはどうなりますか? 親の perl スクリプトはフォアグラウンドで呼び出され、フォークしたにもかかわらずフォアグラウンドに残っていたと思います。
SIGINT はすべての子、つまり親、親の子、および子によって呼び出される外部プログラムに渡されますか??
更新:
付け加えておくと、SIGINIT を発行すると、スクリプトの子によって呼び出された外部プログラムがシグナルを認識して終了するように見えます。しかし、子供たち、またはおそらく親プログラムは続けます。これは私にはすべて不明です。
更新 2 :
tchristさんのコメントですが、Perlのsystem()
コマンドで外部プログラムを呼び出します。
実際、tchrist のコメントにも、私が探していた説明が含まれているようです。私のプログラムの動作に基づいてさらにデバッグした後、実際に、SIGINT が親からすべての子に、すべての子からすべての子 (外部プログラム) に渡されているように見えます。
したがって、tchrist のコメントに基づいて、起こっているように見えるのは、CTRL-C が外部プログラムを強制終了し、子プロセスがsystem()
コマンドの外に出てしまうということです。
で呼び出されたものの終了ステータスを子供たちに確認させましたがsystem()
、CTRL-C は、より多くの処理ラウンドの作成につながるのではなく、親から下のすべてを強制終了すると想定していました。 !
解決策(私の問題):
親で SIGINT のシグナルハンドラーを作成するだけです。次に、シグナルハンドラーは SIGTERM を各子に送信し (これにより、子の子にも SIGTERM が送信されると思います)、親を正常に終了させます。このやや明白な解決策で問題が修正される可能性はありますが、Perl での fork に関する SIGINT の動作に関する私の誤解を理解したいと思いました。