我通过 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()
打印后,父进程可以正确读取。
然而,这是一个示例,我必须处理不手动刷新其输出的程序。
最佳答案
不幸的是,Perl 无法控制它执行的程序的缓冲行为。有些系统有 unbuffer
可以执行此操作的实用程序。如果您有权使用此工具,您可以说
my $pid = open2($out, $in, 'unbuffer ./child_process');
有一个讨论here关于 Windows 的等效工具,但我不能说它们是否有效。
关于perl - 子进程的刷新输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54538273/