Что не так с этим использованием IPC :: Open3? - PullRequest
0 голосов
/ 20 сентября 2011
use IPC::Open3;

local(*A, *B, *C);

my $cmd = \&run;
my @args = ();
my $childpid = open3(*A, *B, *C, $cmd, @args);
print A "stuff\n";
close(A); 
my @outlines = <B>; 
my @errlines = <C>; 
print "STDOUT:\n", @outlines, "\n";
print "STDERR:\n", @errlines, "\n";
close B;
close C;
waitpid($childpid, 0);
if ($?) {
    print "That child exited with wait status of $?\n";
}

sub run {

}

Это сообщение:

STDERR:
sh: -c: line 0: syntax error near unexpected token `0x67bc50'
sh: -c: line 0: `CODE(0x67bc50)'

Почему?

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Похоже, $cmd должна быть реальной командой оболочки, а не подпрограммой perl. Сообщение об ошибке приходит от perl, пытающегося выполнить строковую ссылку на подпрограмму CODE(0x67bc50) в оболочке.

Чтобы получить возвращаемое значение из подпрограммы в качестве команды, используйте $cmd->(). Это, возможно, не делает то, что я думаю, вы ожидаете, однако.

1 голос
/ 20 сентября 2011

Вы можете переместить саб в свой собственный скрипт.Или вы можете использовать специальную команду "-" для разветвления без запуска exec.

my $pid = open3(*A, *B, *C, '-');
if (!$pid) {
   run();
   exit(0);
}

Кстати,

my @outlines = <B>; 
my @errlines = <C>; 

страдает от состояния гонки.Если ребенок печатает в STDERR достаточно, чтобы заполнить канал, два процесса зашли в тупик.Очень трудно сделать это правильно, поэтому я предлагаю вам использовать модуль более высокого уровня, такой как IPC :: Run.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...