在Perl中检测管道末端

在Perl中检测管道末端,perl,pipe,eof,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++) { pr

我试图在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;
}
my($RD,$WR);
管道(RD$WR);
if(fork())
{
#母公司
而(!eof$RD){print“From Child:“.readline($RD);}
打印“父级到达EOF\n”;
}否则{
#孩子
对于(my$i=0;$i<25;$i++){print$WR“$i\n”;}
接近$WR;
}

父级接收并打印来自子级的所有行。但是父级从未检测到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;
}
管道(我的($RD,$WR))
或模具(“管道:$!\n”);
已定义(my$pid=fork())
或者死(“fork:$!\n”);
如果($pid){
#母公司
关闭(西铁);;
打印“来自子项:$\u”,同时;
打印“父级到达EOF\n”;
}否则{
#孩子
收盘价($RD);
为0..25打印$WR“$\n”;
}

这是一个你正在分叉的过程(不是线程)。ikegami给了你一个完整的答案,但是你可能还想再看一看,有一些奇怪的相似问题和观点。好吧,这取决于操作系统。如果您使用的是unix/linux类型的操作系统,那么是的,这是一个新进程。在我工作的Windows上,您无法获得真正的新进程。你得到了一个模拟的新进程,它实际上是一个线程。啊,一个很好的观点。没有想到Windows。啊,没有意识到幕后正在进行计数。工作起来很有魅力-谢谢!