如何在可用时从标准输入读取行(否则阻止)?
Posted
技术标签:
【中文标题】如何在可用时从标准输入读取行(否则阻止)?【英文标题】:How to read lines from stdin whenever available (block otherwise)? 【发布时间】:2012-04-13 00:36:36 【问题描述】:在下面的代码中,p00
是一个命名管道,由 mkfifo p00
创建。
在控制台 1 中,我运行了:
% perl -ne 'print "PERL: $_"' < p00
然后,当上述被阻止时(如预期的那样),我在控制台 2 中运行
% seq 3 > p00
结果,控制台1中出现了以下内容:
PERL: 1
PERL: 2
PERL: 3
%
这几乎是我希望达到的结果,除了 perl
脚本在打印第三行后终止。
我希望脚本继续回显行(以“PERL:”为前缀)只要它们可用,否则阻止。
上面单行的以下变体表面上类似于所需的行为:
perl -e 'while ( 1 ) print "PERL: $_" while <>; sleep 1 ' < p00
...但这不是真正的交易,因为它在等待输入时不会阻塞,也不会在输入可用时立即回显。
注意事项:
-
这个问题背后的动机是教育(即我的),仅此而已;我不是要解决任何实际问题;我只是想学习更多 perl(和 unix)。
我不确定这个问题是否更适合 unix.se.com;如果是的话,我很乐意在那里重新发布它;请告诉我。
【问题讨论】:
这是fifo
的行为方式:一旦作者关闭它,读者就会得到EOF
。读者可能不得不重新打开fifo
,但它不能通过shell重定向来完成。
@MaximYegorushkin:您的评论让我意识到我所要做的就是摆脱sleep 1
!然后我发布的第二个版本正是我想要的。谢谢!
【参考方案1】:
阅读 Maxim Yegorushkin 的评论后,我意识到我所要做的就是在第二个版本中删除 sleep 1
。即,这正是我想要的:
perl -e 'while ( 1 ) print "PERL: $_" while <> ' < p00
正如 Maxim 所写,内部循环在收到 EOF
时终止;然后外层循环将脚本返回到阻塞状态,等待输入……Doh!
【讨论】:
这很有趣;假设p00
是文件而不是 FIFO。然后,您修改后的脚本将在添加到文件时读取额外的行(>>
追加或重写文件并添加比以前更多的行)。因此,Perl 在新尝试读取之前重置输入流(标准输入)上的 EOF 指示符。以上是关于如何在可用时从标准输入读取行(否则阻止)?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 C++ 中从标准输入读取行比 Python 慢得多?