Perl:将子标准输出管道传输到父进程

Perl: Piping child stdout to parent process

在 Perl 中,我可以打开一个子进程并将其输出通过管道传输到调用 Perl 脚本,如下所示:

open(my $cmd, '-|', 'ls') or die $!;
while (<$cmd>) {
   print $_;
}

这将打印我的工作文件夹中的文件,例如:

> foo.txt
> bar.txt
> ...

但是我想对一个保持打开状态的子进程做同样的事情,例如将 tcpdump 的标准输出通过管道传输到 Perl,我尝试了类似的操作:

open(my $cmd, '-|', 'tcpdump') or die $!;
while (<$cmd>) {
   print $_;
}

...但除了 tcpdump 启动文本之外,这不会显示任何 http 日志。它似乎只是挂起。给出了什么?

这是缓冲问题。我需要将 -U 标志添加到 tcpdump。这会导致数据包一收到就被写入。