使用PHP的proc_open()
,我可以使用STDOUT
启动一个进程,一次从STDERR
和fread()
(单独)读取任意数量的字节正在运行,使用feof()
和STDOUT
管道上的STDERR
检测进程何时完成,然后使用proc_close()
获取进程的退出代码。我已经用PHP完成了所有这些。它效果很好,并且给了我很多的控制权。
有没有办法在Perl中完成所有这些事情?总而言之,我需要能够做到以下几点:
STDOUT
和STDERR
STDOUT
和STDERR
任意数量的字节(即无需等待进程完成)提前感谢您的回答。
答案 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并返回退出值