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