为啥 IPC::Open2::open2 返回父进程 ID?
Posted
技术标签:
【中文标题】为啥 IPC::Open2::open2 返回父进程 ID?【英文标题】:Why is IPC::Open2::open2 returning the parent process ID?为什么 IPC::Open2::open2 返回父进程 ID? 【发布时间】:2009-06-10 18:30:47 【问题描述】:我在 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。有什么想法吗?
【问题讨论】:
【参考方案1】:我刚刚跑了:
#!/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
这个东西?
【讨论】:
【参考方案2】:这似乎适用于我的 Strawberry Perl 5.10 和 cygwin。我输出两个进程 ID 以确保我正在查看正确的内容。我还在 $exe 中放了一些东西,所以有一个命令可以执行。奇怪的是,即使$exe
是 undef 并且仍然返回不是父进程 ID 的 PID,open2 也能正常工作。
你不需要 gensym 的东西。如果 open2 的参数是未定义的左值,open2 将自动生成文件句柄。
【讨论】:
以上是关于为啥 IPC::Open2::open2 返回父进程 ID?的主要内容,如果未能解决你的问题,请参考以下文章