在 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;
}
我正在尝试在 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;
}