IPC::Open3的文档指出:
The CHLD_IN will have autoflush turned on
但源代码中没有提到IO::Handle::autoflush
. 模块使用什么机制来打开 autoflush CHLD_IN
?
IPC::Open3的文档指出:
The CHLD_IN will have autoflush turned on
但源代码中没有提到IO::Handle::autoflush
. 模块使用什么机制来打开 autoflush CHLD_IN
?
使用以下行禁用缓冲
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
。