什么是PHP的proc_open(),proc_close()等的Perl等价物?

时间:2010-10-03 04:32:14

标签: linux perl process stdout stderr

使用PHP的proc_open(),我可以使用STDOUT启动一个进程,一次从STDERRfread()(单独)读取任意数量的字节正在运行,使用feof()STDOUT管道上的STDERR检测进程何时完成,然后使用proc_close()获取进程的退出代码。我已经用PHP完成了所有这些。它效果很好,并且给了我很多的控制权。

有没有办法在Perl中完成所有这些事情?总而言之,我需要能够做到以下几点:

  • 启动外部流程
  • 单独阅读STDOUTSTDERR
  • 在进程运行时一次读取STDOUTSTDERR任意数量的字节(即无需等待进程完成)
  • 检测过程何时结束
  • 获取流程的退出代码

提前感谢您的回答。

3 个答案:

答案 0 :(得分:3)

您可以使用Perl的系统调用接口推出自己的解决方案,但使用内置模块IPC :: Open3更容易。至于你的清单:

启动外部流程:

use IPC::Open3;
use IO::Handle;
use strict;

my $stdout = IO::Handle->new;
my $stderr = IO::Handle->new;
my $pid = open3(undef, $stdout, $stderr, 'my-command', 'arg1', 'arg2');

分别读取STDOUT和STDERR,一次是任意数量的字节:

my $line = <$stdout>;
# Or
sysread $stderr, my $buffer, 1024;

检测过程何时结束:

use POSIX qw(sys_wait_h);

waitpid $pid, 0;  # Waits for process to terminate
waitpid $pid, WNOHANG;  # Checks if the process has terminated

获取流程的退出代码:

my $status = $?;  # After waitpid indicates the process has exited

请务必阅读IPC :: Open3文档;正如它警告的那样,如果你不小心,当你有单独的stdout和stderr管道时很容易让自己陷入僵局。如果子进程填充任一管道,它将阻塞,如果父进程读取其他管道,将阻止。

答案 1 :(得分:2)

您想要这个模块:IPC::Open3

答案 2 :(得分:1)

您想要IPC :: Run,它会捕获IO并返回退出值