1

IPC::Open3的文档指出:

The CHLD_IN will have autoflush turned on

源代码中没有提到IO::Handle::autoflush. 模块使用什么机制来打开 autoflush CHLD_IN

4

1 回答 1

2

使用以下行禁用缓冲

select((select($handles[0]{parent}), $| = 1)[0]); # unbuffer pipe

可以重写为

my $old_fh = select($handles[0]{parent});
$| = 1;
select($old_fh);

在 Perl 中禁用输出缓冲的传统方法是通过$|变量。来自man perlvar

  • 处理->自动刷新(EXPR)
  • $OUTPUT_AUTOFLUSH
  • $|

如果设置为非零,则在当前选定的输出通道上每次写入或打印后立即强制刷新。默认值为 0(无论通道是否真正被系统缓冲;$| 只告诉您是否明确要求 Perl 在每次写入后刷新)。如果输出到终端,则 STDOUT 通常会被行缓冲,否则会被块缓冲。设置此变量主要在您输出到管道或套接字时很有用,例如当您在 rsh 下运行 Perl 程序并希望看到正在发生的输出时。这对输入缓冲没有影响。请参阅 getc 。请参阅选择以了解如何选择输出通道。另请参阅 IO::Handle。

助记符:当你想让你的管道滚烫时。

设置$|作用于以单参数形式设置的“当前选择的输出通道” select

于 2016-12-11T10:41:40.387 回答