我在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。有什么想法吗?
答案 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将自动生成文件句柄。