Предполагается, что дескриптор создан со следующим кодом:
use IO::File;
my $fh = IO::File->new;
my $pid = $fh->open('some_long_running_proc |') or die $!;
$fh->autoflush(1);
$fh->blocking(0);
, а затем читать с циклом, как это:
while (some_condition_here) {
my @lines = $fh->getlines;
...
sleep 1;
}
Что я могу указать как some_condition_here
, который вернет false, если процесс на другом конце канала завершился?
Тестирование на $fh->eof
не будет работать, поскольку процесс все еще может выполняться без печати каких-либо новых строк. Тестирование на $fh->opened
, похоже, ничего полезного не дает.
В настоящее время я использую $pid =! waitpid($pid, WNOHANG)
, который, кажется, работает в POSIX-совместимых средах. Это лучший способ? Как насчет Windows?