Perl匿名管没有输出

时间:2016-01-28 10:37:12

标签: linux bash perl

问题

为什么在使用匿名管道时没有打印,除非我从管道打印实际数据?

实施例

use strict;
use warnings;

my $child_process_id = 0;
my $vmstat_command = 'vmstat 7|';
$child_process_id = open(VMSTAT, $vmstat_command) || die "Error when executing \"$vmstat_command\": $!";


while (<VMSTAT>) {
    print "hi" ;
}
close VMSTAT or die "bad command: $! $?";

似乎挂起

use strict;
use warnings;

my $child_process_id = 0;
my $vmstat_command = 'vmstat 7|';
$child_process_id = open(VMSTAT, $vmstat_command) || die "Error when executing \"$vmstat_command\": $!";


while (<VMSTAT>) {
    print "hi" . $_ ;
#                ^^^ Added this
}
close VMSTAT or die "bad command: $! $?";

打印

hiprocs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------
hi r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
hi 1  0      0 7264836 144200 307076    0    0     0     1    0   14  0  0 100  0  0

等...

预期行为

对于第一个例子,将为vmstat的每一行输出打印hi。

版本

perl, v5.10.0
GNU bash, version 3.2.51

其它

在打印行之前使用chomp时,它似乎也会挂起(我认为只删除了换行符)。

我觉得我遗漏了一些关于如何读取和处理管道的基本信息,但却找不到类似的问题。如果有一个然后欺骗这个,我会看看它。

只需要询问任何进一步的信息。

1 个答案:

答案 0 :(得分:6)

改变

print "hi";

print "hi\n";

它也&#34;工作&#34;

失败的原因是默认情况下输出是行缓冲的

设置$|将立即刷新缓冲区

  

如果设置为非零,则在当前所选输出通道上的每次写入或打印后立即强制刷新。默认值为0(无论系统是否真正缓冲了该通道;&#34; $ |&#34;仅告诉您在每次写入后是否明确要求Perl进行刷新)。如果输出到终端,则STDOUT通常是线路缓冲的,否则阻塞。设置此变量主要在输出到管道或套接字时很有用,例如在rsh下运行Perl程序并希望在输出时看到输出。这对输入缓冲没有影响。请参阅perlfunc联机帮助页中的getc条目。 (助记符:当你想让你的管子发烫时。)