我正在尝试在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的正确方法是什么?
答案 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;
}