为啥 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 也能正常工作。

使用 IPC::Open2; 使用符号 qw(gensym); $exe = 'cmd.exe /c 目录 /b'; 我的 $in = gensym(); 我的 $out = gensym(); 我的 $pid = open2($out, $in, $exe); print "我是 pid $$: open2 is pid $pid\n"; 关闭 $in; 打印 ; 等待pid $pid, 0;

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

【讨论】:

以上是关于为啥 IPC::Open2::open2 返回父进程 ID?的主要内容,如果未能解决你的问题,请参考以下文章

mybash的实现

python多进程

Linux高性能服务器编程:多进程编程

Process用法与进程详解

Linux系统编程-进程创建(fork)外部程序调用(exec)

深入理解计算机系统 第八章 异常控制流(2)