在写入之前检查管道是否为空

时间:2017-09-30 16:18:28

标签: perl pipe buffering

我继承了一个perl程序,它打开了另一个程序的管道:

open(CONSUMER, "|/bin/consumer >> logfile 2>&1") ||
    die "Comsumer open fail\n";
select(CONSUMER); $| = 1;

然后在循环中重复写入此管道:

while (<INPUT>) {
    $command=$_;
    ...
#   is CONSUMER empty?
    print CONSUMER $command;
}

似乎这些命令中的一堆被缓冲在管道缓冲区中。这垄断了CONSUMER正在使用的服务。在某些时候这个:

select(undef, undef, undef, 0.1);

被添加到循环的底部作为(不是非常有效)的绑定。

最有效的方法是,如果可以在print前检查以确保管道缓冲区为空,然后再继续print

这一切都可能吗?

0 个答案:

没有答案