我有一个显示提示消息并等待用户输入一些文本的程序。
$ program
Input a line of text: <aaaa>
Some more output.
$
现在,我还希望能够通过 FIFO 以编程方式提供此输入,如下所示:
$ program < fifo
但是发生的事情是,在我将输入提供给fifo
.
接下来我尝试了一个非常简单的程序,如下所示:
$ echo aaaa < fifo
即使在这里,aaaa
也不会出现,直到fifo
提供了它的输入。
问题:在使用 FIFO 时,如何使我的输出直到我等待输入stdin
出现?stdout
FIFO由shell打开,但它的打开是阻塞的,直到FIFO被其他进程打开写入。由于重定向是在执行命令之前
open()
处理的,因此在 shell 的调用返回之前,程序甚至不会执行。这是C 库函数(由 shell 使用)的记录行为:open()
O_NONBLOCK
所以shell在打开FIFO时显然没有使用。解决方案:
cat fifo | program
cat
从 FIFO 读取直到文件结束,然后退出。tail -f fifo | program
tail
从 FIFO 读取直到文件结束,然后挂起等待更多直到终止。其中哪一个最适合您的情况取决于在另一端写入 FIFO 的内容以及写入方式。
第三种解决方案涉及让程序在需要时打开 FIFO。
根据Rationale 部分
sh
,shell 必须将标准输入设置为阻塞,因为...