【问题标题】:How does IPC::Open3 enable autoflush for CHLD_INIPC::Open3 如何为 CHLD_IN 启用自动刷新
【发布时间】:2017-04-26 09:15:07
【问题描述】:

IPC::Open3 的文档指出:

The CHLD_IN will have autoflush turned on

source code 中没有提到IO::Handle::autoflush。模块使用什么机制为CHLD_IN开启自动刷新?

【问题讨论】:

    标签: perl perl-module autoflush


    【解决方案1】:

    以下行禁用缓冲

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

    可以改写为

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

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

    • HANDLE->autoflush(EXPR)
    • $OUTPUT_AUTOFLUSH
    • $|

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

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

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

    【讨论】:

    • 这种传统方式非常神秘!感谢您的回答 - 它不仅完整地解释了这个问题,而且还指出了正确的文档。我现在知道,在我自己的代码中,为了便于阅读,我将改为使用 HANDLE->autoflush(1)
    猜你喜欢
    • 2014-07-09
    • 2017-02-18
    • 2012-04-19
    • 2012-08-17
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多