perl - 子进程的刷新输出

标签 perl process output buffer

我通过 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/

相关文章:

python - 重新排列数据文件并包含序列号

perl - 如何在字符串中重复一个字符n次?

perl: IPC::Open3 无法使用 FCGI 打开 STDERR

java - 从 Servlet/JSP 调用 Unix Shell 命令

linux - 使用 SED/AWK/Perl 单行中的条件加入 FASTA 文件中的换行符

c# - 为什么.exe 拒绝停止?

linux - Linux 中的用户 ID 和组 ID

C# 在 .net 中切换窗口

mysql - 如何抑制单个 SQL 语句的列标题输出?

c++ - 我将如何从二叉树写入 txt 文件?