为什么IPC :: Open2 :: open2返回父进程ID?

时间:2009-06-10 18:30:48

标签: perl ipc

我在cygwin的Perl 5.10中运行了以下脚本:

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

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

waitpid $pid, 0;

$ pid的值是运行的perl进程的PID,而不是$exe指向的可执行文件的PID。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我跑了:

#!/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 :(得分:1)

这似乎适用于Strawberry Perl 5.10和cygwin。我输出两个进程ID以确保我正在查看正确的事情。我还在$ exe中放了一些东西,所以有一个命令可以执行。奇怪的是,即使$exe为undef并且仍然返回不是父进程ID的PID,open2也能正常工作。

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;

你不需要gensym的东西。如果文件句柄的参数是未定义的左值,open2将自动生成文件句柄。