如何在可用时从标准输入读取行(否则阻止)?

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。然后,您修改后的脚本将在添加到文件时读取额外的行(&gt;&gt; 追加或重写文件并添加比以前更多的行)。因此,Perl 在新尝试读取之前重置输入流(标准输入)上的 EOF 指示符。

以上是关于如何在可用时从标准输入读取行(否则阻止)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 C++ 中从标准输入读取行比 Python 慢得多?

为啥在 C++ 中从标准输入读取行比 Python 慢得多?

如何将标准输入重定向到 Windows 命令行中的文件?

如何从标准输入读取一行,阻塞直到找到换行符?

如何加载程序读取标准输入并在 gdb 中获取参数?

Python,“过滤”行编辑,按字符读取标准输入,没有回声