2009-06-10 62 views
0

我有以下腳本在Perl 5.10運行在Cygwin的:爲什麼IPC :: Open2 :: open2返回父進程ID?

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指向。有任何想法嗎?

回答

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__ 

和觀察:爲什麼您使用的是gensym東西反正

 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 

1

這似乎與草莓Perl 5.10和cygwin一起工作。我輸出兩個進程ID以確保我正在查看正確的東西。我也把一些東西放在$ exe中,所以有一個命令可以執行。奇怪的是,即使$exe未定義,open2仍然有效,並且仍然返回不是父進程ID的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; 

你不需要gensym的東西。如果其參數是undef的左值,則open2將自動生成文件句柄。

相關問題