为什么在使用匿名管道时没有打印,除非我从管道打印实际数据?
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时,它似乎也会挂起(我认为只删除了换行符)。
我觉得我遗漏了一些关于如何读取和处理管道的基本信息,但却找不到类似的问题。如果有一个然后欺骗这个,我会看看它。
只需要询问任何进一步的信息。
答案 0 :(得分:6)
改变
print "hi";
到
print "hi\n";
它也&#34;工作&#34;
失败的原因是默认情况下输出是行缓冲的
设置$|
将立即刷新缓冲区
如果设置为非零,则在当前所选输出通道上的每次写入或打印后立即强制刷新。默认值为0(无论系统是否真正缓冲了该通道;&#34; $ |&#34;仅告诉您在每次写入后是否明确要求Perl进行刷新)。如果输出到终端,则STDOUT通常是线路缓冲的,否则阻塞。设置此变量主要在输出到管道或套接字时很有用,例如在rsh下运行Perl程序并希望在输出时看到输出。这对输入缓冲没有影响。请参阅perlfunc联机帮助页中的getc条目。 (助记符:当你想让你的管子发烫时。)