perl - IPC::Open3::open3() 不适用于 perl 5.14.2 和 perl 5.10.1?

标签 perl ipc ipcopen3

在我们的一个模块中,我们检查给定的二进制文件 (varnishd) 是否存在,如果存在,我们运行额外的测试。

为了执行检查,我们使用 IPC::Open3 ,像这样(为了清楚起见,示例被剥离):

perl -MIPC::Open3 -le '
    my $binary = "varnishd";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'

在 Debian Squeeze 或 Ubuntu Natty 下,带有 perl 5.10.1 , 如果 varnishd在系统上找不到,这将打印 65280为了我。
如果您更改 $binaryperl ,然后是(正确)打印0 .

但是,使用 Ubuntu Precise 和 perl 5.14.2 ,这不再以相同的方式工作,并产生以下内容:
$ perl -MIPC::Open3 -le '
    my $binary = "varnishd";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'
open3: exec of varnishd -V failed at -e line1

当我更改 $binary存在的东西,例如perl ,然后它可以正常工作并打印0 .
$ perl -MIPC::Open3 -le '
    my $binary = "perl";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'
0

看了其他问答,看来我想看看IPC::Run ,但实际上我想:
  • 了解这种行为差异
  • 避免更多的依赖 如果可能的话

  • 编辑:忘了提到这些东西是在 下运行的。 chroot 环境,Squeeze 和 Precise 系统,如果这完全相关(例如 /dev 文件系统差异?)。

    最佳答案

    您注意到 bug fix .

    在你所说的 5.10.1 版本中,open3报告该程序运行并以代码 255 退出。这些都不是真的。

    在你所说的 5.14.2 版本中,open3抛出一个异常,因为它一直被记录在案,并且它总是对一些其他问题做。您可能会发现使用 eval BLOCK 启动子进程失败。如果需要的话。

    关于perl - IPC::Open3::open3() 不适用于 perl 5.14.2 和 perl 5.10.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12072168/

    相关文章:

    perl: IPC::Open3 无法使用 FCGI 打开 STDERR

    perl - 如何使用 MooseX::Method::Signatures 获取传递给方法的所有参数?

    perl - Perl 方法属性如何工作?

    perl - 如何从 Perl 控制 Windows GUI 应用程序?

    perl - Perl中的system,exec和backticks之间有什么区别?

    perl IPC :Open3 minimal to pass perlcritic?

    multithreading - 线程、Coro、Anyevent 混淆

    带套接字的 Java IPC - 使用环回设备

    c++ - 在 Linux 上的进程之间传递消息的最快技术?

    perl - IPC::Open3 并确定 child 是否正在等待输入