【问题标题】:What is the Perl equivalent of PHP's proc_open(), proc_close(), etc.?PHP 的 proc_open()、proc_close() 等的 Perl 等价物是什么?
【发布时间】:2010-10-03 04:32:13
【问题描述】:

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

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

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

提前感谢您的回答。

【问题讨论】:

  • 我知道我可以像这样做大部分我想做的事情:system('command 2> stderr.txt > stdout.txt &');然后在进程运行时简单地读取文件,但是我想不出一种简单的方法来检测进程何时完成(不涉及解析“ps ...”输出或其他东西)或获取它退出代码。

标签: linux perl process stdout stderr


【解决方案1】:

您可以使用 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 管道时,很容易陷入僵局。如果子进程填满了任一管道,它将阻塞,如果父进程读取other管道,it将阻塞。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 2012-09-06
      • 1970-01-01
      • 2011-09-02
      • 2012-03-20
      • 2023-04-04
      • 1970-01-01
      • 2011-09-14
      • 2011-03-08
      相关资源
      最近更新 更多