1

独自の子を作成する非同期子プロセスを実行するソリューションを探しています。

通常、孫プロセスはシェル コマンドを実行し、その結果が子プロセスに返されます。

Forks::Super他にも面白い機能があるので使ってみたいです。

以下のコードは機能しますが、子の一時ファイルを削除できなかったという警告が表示されます。

私は何を間違っていますか?

use Forks::Super ':all';
$Forks::Super::CHILD_FORK_OK = 1;
use Proc::ProcessTable;

my %result;
for (;;) {
    $cnt++;
    if (($cnt %= 5) eq 0) {    #Start child if modulo 5 eq 0 (demo trigger)
        $child_pid = fork { sub => \&startChild };
        $result{$child_pid} = undef;     # We use only the hash key as identifier, the value is reserved for later usage
    }
    for my $pnt (sort keys %result) {    #maintain our internal process hash
        if (!&checkProcess($pnt)) {      #check our running childs
            print "PID $pnt has gone\n";
            delete $result{$pnt};
        }
    }
    sleep 1;
}    #endless

sub startChild {
    print "Starting Child $$\n";
    tie my @output, 'Forks::Super::bg_qx', qq["date"];
    sleep 2 + rand 7;
    print "Result was $output[0]\n";
    print "End  Child $$\n";
}

sub checkProcess {
    $tobj = new Proc::ProcessTable;
    $proctable = $tobj->table();
    for (@$proctable) {
        if ($_->pid eq $_[0]) {
            print "Found Child with PID $_[0]\n";
            return 1;
        }
    }
    return undef;
}

出力はコメント フィールドが長すぎます。最近のエラー行は次のとおりです。

Child 2767 had temp files!
    /usr/local/dev/threading/.fhfork2767/README.txt
    /usr/local/dev/threading/.fhfork2767/.fh_001
    /usr/local/dev/threading/.fhfork2767/.fh_002.signal
    /usr/local/dev/threading/.fhfork2767/.fh_003
    /usr/local/dev/threading/.fhfork2767/.fh_004.signal
    at /usr/local/share/perl/5.10.1/Forks/Super/Job/Ipc.pm line 3115

Forks::Super::Job::Ipc::deinit_child() called
    at /usr/local/share/perl/5.10.1/Forks/Super/Job.pm line 1857 
4

1 に答える 1

2

これらは単なる警告メッセージであり、設定している場合は不要です$Forks::Super::CHILD_FORK_OK > 0

気になる場合は、その行(の3115行目)を削除するForks/Super/Job/Ipc.pmか、次のように変更してください。

Carp::cluck("Child $$ had temp files! @IPC_FILES\n")
unless $Forks::Super::CHILD_FORK_OK >= 0;

Forks::Superこれは次のリリースでクリーンアップします。

于 2013-03-05T18:18:48.757 に答える