输入回路有FIFO问题

时间:2013-01-06 06:42:24

标签: linux bash shell redirect fifo

我在使用FIFO作为标准输入时遇到了一些麻烦。

我有一个这样的脚本:

#!/usr/bin/env ruby
while true do
    data = gets
    puts "Got: #{data}"
end

然后我按照以下方式运行:

$ ./script < input.fifo &
$ echo testdata > input.fifo

它将打印如下内容:

Got: testdata
Got:
Got:
Got:
Got:
Got:
etc.

我怀疑FIFO有问题。在将内容发送到脚本后,该内容不会被清除。

我尝试使用scanf(“%d”...)的类似输入循环的C程序做同样的事情,它的行为如下:

$ echo 1 > input.fifo
Got: 1
Got: 1
Got: 1
Got: 1
etc.

所以看起来FIFO中的最后一件事就会卡在那里。在ruby示例中,它是一个空行,因为gets捕获了\ n。在第二个中它是1本身。

任何人都可以提供任何见解吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

情况很简单,经过:
'echo 1&gt; input.fifo',文件'input.fifo'被打开,“1”被写入其中,
它已关闭。

问题在于它已关闭。当fifo从写作侧关闭时,这对于阅读方来说是相同的“文件结束”。因此,如果您在C示例中检查“scanf”的返回码,它将等于EOF常量
在“文件结束”之后,当您从fifo读取所有数据时,尝试读取内容, “阅读”代码将立即返回并报告“文件结束”。