【发布时间】: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!然后我发布的第二个版本正是我想要的。谢谢!
标签: perl unix named-pipes