在Perl中检测管道的末尾

时间:2017-03-27 20:52:29

标签: perl pipe eof

我正在尝试在perl中分叉一个单独的进程/线程,并通过管道将输入返回给父进程。例如:

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;
}

孩子的所有行都会被父母收到并打印出来。但是父母从来没有检测到EOF并且在那个循环中停留,等待。在这里检测EOF的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

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

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;
}