2

こんにちは私はperlスクリプトが「子プロセスが見つかりません」を吐き出すというこの問題を抱えています...

私のスクリプトはいくつかの異なるタイプのフォークを呼び出すので、perldocのwaitpid()実装メソッドを実装して、forkとexec、systemとqwの両方のハンドルを使用できるようにしてみました。

 $SIG{CHLD} = sub {
    # don't change $! and $? outside handler
    local ($!, $?);
    my $pid = waitpid(-1, WNOHANG) > 0;
    return if $pid == -1;
    return unless defined $children{$pid};
    delete $children{$pid};
};

    my $pid = fork();
    die "cannot fork" unless defined $pid;
    if ($pid == 0) {
        # ...
        exit 0;
    } else {
        $children{$pid}=1;
        # ...
        exec($command);
   }

コードの実行のこの部分に問題はありませんが、ファイルハンドルのCLOSEを閉じようとすると、「子プロセッサが見つかりません」というメッセージが表示されます。私はこの問題をもっと深く理解したいので、誰かが私にこれがなぜ起こっているのか説明できますか?OPEN呼び出しによってフォークされた子プロセスを取得して、クローズがファイルハンドルの処理方法を認識しないようにするのでしょうか。または多分私は100%オフです。任意の解決策をいただければ幸いです

open(RESULTS, "-|", "find $dir\/ -maxdepth 1 -name RESULTS -print0 | xargs -0 cat ") or die $!;
while(<RESULTS>){
if($_ =~ /match/){
    print $_;
 }
  }
 close RESULTS;
4

1 に答える 1

3

closewaitpidこのように開かれたハンドル*で、によって作成された子を刈り取るために呼び出しますopen。ただし、シグナルハンドラーは以前に子を刈り取ることができたため、子を見つけることができなかったためclose、エラーが返されました。closeclose

forkこれを修正するには、シグナルハンドラーを変更して、(以下)を使用して作成した子のみを取得するか、からのエラーを無視しますclose

$SIG{CHLD} = sub {
   local ($!, $?, $^E);
   for my $pid (keys(%children)) {
      if (waitpid($pid, WNOHANG) > 0) {
         delete $children{$pid};
      }
   }
};

* —適切な用語は「ファイルハンドル」です。それはあなたがファイルを保持することを可能にするのでそのような名前が付けられています。アクションを実行しないため、ハンドラーではありません。

于 2012-10-03T21:11:24.980 に答える