2009-06-10 5 views
0

私はcygwinの中にはPerl 5.10で実行されている次のスクリプトを持っている:なぜ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__ 

を観察:

 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

これはStrawberry Perl 5.10とcygwinで動作するようです。両方のプロセスIDを出力して、適切なものを確認しています。私は$ exeに何かを置くので、実行するコマンドがあります。奇妙なことに、open2は$exeがundefであっても、親プロセス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のlvalueの場合、open2はファイルハンドルを自動生成します。

関連する問題