在 Perl 中检测管道的结尾

Detecting the end of a Pipe in Perl

我正在尝试在 perl 中创建一个单独的 process/thread 并通过管道将输入返回给 parent。例如:

my($RD, $WR);
pipe($RD, $WR);

if(fork()) 
{
   #parent
   while(!eof $RD) { print "From Child: " . readline($RD); }
   print "Parent reached EOF\n";
} else {
   #child
   for(my $i = 0; $i < 25; $i++) { print $WR "$i\n"; }
   close $WR;
}

child 中的所有行都由 parent 接收并打印出来。但是 parent 从未检测到 EOF 并且卡在 while 循环中,等待。在这里检测 EOF 的正确方法是什么?

仅当引用该句柄的所有文件描述符都关闭时,文件句柄才会关闭。让父级关闭其副本。

pipe(my ($RD, $WR))
   or die("pipe: $!\n");

defined( my $pid = fork() )
   or die("fork: $!\n");

if ($pid) {
   # parent
   close($WR);

   print "From Child: $_" while <$RD>;
   print "Parent reached EOF\n";
} else {
   # child
   close($RD);

   print $WR "$_\n" for 0..25;
}