【发布时间】:2019-02-05 15:53:51
【问题描述】:
我通过IPC::Open2创建了一个子进程。
我需要逐行读取这个子进程的标准输出。
问题是,由于子进程的标准输出没有连接到终端,它是完全缓冲的,在进程终止之前我无法读取它。
如何在不修改其代码的情况下刷新子进程的输出?
子进程代码
while (<STDIN>) {
print "Received : $_";
}
父进程代码:
use IPC::Open2;
use Symbol;
my $in = gensym();
my $out = gensym();
my $pid = open2($out, $in, './child_process');
while (<STDIN>) {
print $in $_;
my $line = <$out>;
print "child said : $line";
}
当我运行代码时,它在等待子进程的输出时卡住了。
但是,如果我用bc 运行它,结果是我所期望的,我相信bc 必须手动刷新它的输出
注意:
在子进程中,如果我在开头添加$| = 1或在打印后添加STDOUT->flush(),父进程可以正确读取。
然而,这是一个示例,我必须处理不手动刷新其输出的程序。
【问题讨论】:
-
一些快速浏览 metacpan 建议 IPC::Run 可能值得研究;它有一种在伪 tty 中运行进程的方法,可以避免您遇到的缓冲问题。
标签: perl process output buffer