Почему IPC :: Open2 :: open2 возвращает идентификатор родительского процесса? - PullRequest
0 голосов
/ 10 июня 2009

У меня есть следующий скрипт на Perl 5.10 в cygwin:

use IPC::Open2;
use Symbol qw(gensym);

my $in = gensym();
my $out = gensym();
my $pid = open2($out, $in, "$exe");

waitpid $pid, 0;

Значение $ pid - это PID запущенного процесса perl, а не исполняемого файла, на который указывает $exe. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 10 июня 2009

Я только что побежал:

#!/usr/bin/perl

use strict;
use warnings;

use IPC::Open2;

my ($in, $out);

my $pid = open2($out, $in, ls => qw(-R /));

warn $pid, "\n";

waitpid $pid, 0;

__END__

и заметил:

     2916    2620    2916       2912  con 1003 14:49:56 /usr/bin/perl
O    2088    2916    2916       4064  con 1003 14:49:57 /usr/bin/ls

Почему вы все равно используете gensym?

1 голос
/ 10 июня 2009

Мне кажется, это работает со Strawberry Perl 5.10 и cygwin. Я вывожу оба идентификатора процесса, чтобы убедиться, что смотрю на правильные вещи. Я также положил что-то в $ exe, так что есть команда для выполнения. Любопытно, что open2 работает даже тогда, когда $exe имеет значение undef и по-прежнему возвращает PID, который не является идентификатором родительского процесса.

use IPC::Open2;
use Symbol qw(gensym);

$exe = 'cmd.exe /c dir /b';

my $in = gensym();
my $out = gensym();
my $pid = open2($out, $in, $exe);

print "I am pid $$: open2 is pid $pid\n";
close $in;
print <$out>;

waitpid $pid, 0;

Тебе не нужны генсим. open2 автоматически сгенерирует дескрипторы файла, если его аргументы будут lvalue, которые не определены.

...