我继承了一个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
。
这一切都可能吗?