我通过创建了一个子进程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
必须手动刷新其输出
note:
在子进程中如果我添加$| = 1
在开始或STDOUT->flush()
打印后,父进程可以正确读取它。
然而,这是一个例子,我必须处理不手动刷新其输出的程序。
不幸的是,Perl 无法控制它执行的程序的缓冲行为。有些系统有一个unbuffer可以执行此操作的实用程序。如果您有权使用此工具,您可以说
my $pid = open2($out, $in, 'unbuffer ./child_process');
有讨论here关于 Windows 的等效工具,但我不能说它们是否有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)