Perl, нет дочернего процесса с "открытым"

Привет у меня есть проблема, когда скрипт perl выплевывает "Не найден дочерний процесс"...

Мой скрипт вызывает несколько разных типов вилок, поэтому я попытался реализовать метод реализации perdoc waitpid(), чтобы иметь возможность использовать handle как 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;

1 ответ

Решение

close на ручке * открывается при этом звонки waitpid пожать ребенка, созданного open, Однако вашему обработчику сигналов удалось пожать ребенка раньше close сделал так close не смог найти ребенка, поэтому close вернул ошибку.

Вы можете исправить это, изменив обработчик сигнала, чтобы он получал только тех детей, которых создал fork (ниже), или вы можете игнорировать эту ошибку от close,

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

* - Правильный термин " дескриптор файла". Он назван так, поскольку он позволяет вам удерживать файл. Это не обработчик, так как он не выполняет никаких действий.

Другие вопросы по тегам