2

私は Linux プラットフォームで Perl を使用しています。まず、スレッドを作成し、この新しいスレッドで子プロセスを fork しました。新しいスレッドの親が戻ってきてメインスレッドに参加したら、作成したスレッドで生成された子プロセスに TERM シグナルを送信したいのですが、シグナルハンドラが機能せず、子プロセスがゾンビ化してしまいます。これが私のコードです:

use strict;
use warnings;
use Thread 'async';
use POSIX;

my $thrd = async {
    my $pid = fork();
    if ($pid == 0) {
        $SIG{TERM} = \&child_exit;
        `echo $$ > 1`;
        for (1..5) {
            print "in child process: cycle $_\n";
            sleep 2;
        }
        exit(0);
    }
    else {
        $SIG{CHLD} = \&reaper;
    }
};

$thrd->detach();
sleep 4;
my $cpid = `cat 1`;
kill "TERM", $cpid;
while (1) {}

sub child_exit {
    print "child $$ exits!\n";
    exit(0);
}

sub reaper {
    my $pid;
    while (($pid = waitpid(-1, &WNOHANG)) > 0) {
        print "reaping child process $pid\n";
    }
}

この状況で信号を正常かつ安全に送信する方法について何か提案はありますか?

4

2 に答える 2

0

問題は、 child_exit が親スレッドで終了を実行しないことだと思います。それはただ子供を出ます。perl で何が起こっているのか正確にはわかりませんが (c で fork/exec-construction を見つけただけです)、親プロセスで SIG_CHILD をキャッチしてその終了を検出しようとします。

(child's 1 で「child $$ exits」というメッセージが出力されるので、画面に表示されませんよね?)

編集:私はちょうどあなたの例を試してみました。!= 0 をチェックするだけかもしれません。

于 2013-05-16T11:26:31.943 に答える