在Perl中检测管道末端
我试图在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
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。啊,没有意识到幕后正在进行计数。工作起来很有魅力-谢谢!