Я хотел бы выполнить внешнюю команду rtmpdump
и прочитать ее STDOUT
и STDERR
отдельно, но не дождаться окончания такой команды, но прочитайте ее частичные выходы в массивах, когда они доступны .. .Чтение STDOUT и STDERR внешней команды без ожидания
Что такое безопасный способ сделать это на Perl?
Это код у меня есть, что работает «на линии» основе:
#!/usr/bin/perl
use warnings;
use strict;
use Symbol;
use IPC::Open3;
use IO::Select;
sub execute {
my($cmd) = @_;
print "[COMMAND]: $cmd\n";
my $pid = open3(my $in, my $out, my $err = gensym(), $cmd);
print "[PID]: $pid\n";
my $sel = new IO::Select;
$sel->add($out, $err);
while(my @fhs = $sel->can_read) {
foreach my $fh (@fhs) {
my $line = <$fh>;
unless(defined $line) {
$sel->remove($fh);
next;
}
if($fh == $out) {
print "[OUTPUT]: $line";
} elsif($fh == $err) {
print "[ERROR] : $line";
} else {
die "[ERROR]: This should never execute!";
}
}
}
waitpid($pid, 0);
}
Но приведенный выше код работает только в текстовом режиме, я считаю. Чтобы использовать rtmpdump
в качестве команды, мне нужно собрать частичные выходы в двоичном режиме, поэтому не читайте STDOUT
по строке, как указано в приведенном выше коде.
Двоичный выход STDOUT должен храниться в переменной, а не печатать.
Я должен уточнить одну проблему: кроме хранения данных STDOUT для переменной мне нужно иметь возможность обрабатывать эти частичные данные, когда они доступны. Другими словами, некоторые функции должны вызывать новые данные STDOUT каждый раз, когда они доступны. –
@ Ωmega замените '\ $ out_buf' на sub ref –
Как и @mpapec, следуйте примеру STDERR. – ikegami