6

この質問に対する以前の回答は、フォークに焦点を当てていました。

この質問では、'system' 関数の呼び出しについて質問しています。

sleep.plというスクリプトがあるとします:

use strict;
use warnings;
sleep(300);

次に、 kill.plというスクリプトがあります。

use strict;
use warnings;
system("sleep.pl");

kill.pl を実行し、ps を使用して kill.pl のプロセス ID を見つけて強制終了します (kill -9 を使用せず、通常の強制終了のみ)。

sleep.pl はまだ眠っています。

私の質問の解決策には SIG ハンドラーが関係していると思いますが、子プロセスを強制終了するにはハンドラーに何を入れる必要がありますか?

4

3 に答える 3

4

setsidを使用して、プロセスを新しいグループ リーダーにします。次に、グループ ID に kill を送信して、グループに属するすべてのプロセスを強制終了できます。リーダー プロセスから生成されたすべてのプロセスは、グループ ID を継承し、新しく作成されたグループに属します。そのため、グループにキルを送ると、全員がキルされます。唯一のトリッキーなことは、setsid を使用できるようにするために、標準の入力と出力を閉じる必要があることです。これは、setsid の要件であるためです。

于 2009-04-22T23:55:30.547 に答える
2

あなたの質問は、より一般的な「親が亡くなったときに子供が確実に死ぬようにする方法」の特定の例です。それを回避することはできません。system(); について特別なことは何もありません。子プロセスを fork し、それが終了するのを待つだけです。

system() はおおよそ次のとおりです。

sub system 
{
    my $kidpid = fork;
    if ( $kidpid )
    {
        waitpid $kidpid; 
          # parent process blocks here waiting for the child process to return
    }
    else
    {
        exec( @_ );
    }
}

プロセス グループを強制終了することが唯一の選択肢です。

于 2010-07-06T20:21:20.723 に答える