我在使用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本身。
任何人都可以提供任何见解吗?
谢谢!
答案 0 :(得分:0)
情况很简单,经过:
'echo 1&gt; input.fifo',文件'input.fifo'被打开,“1”被写入其中,
它已关闭。
问题在于它已关闭。当fifo从写作侧关闭时,这对于阅读方来说是相同的“文件结束”。因此,如果您在C示例中检查“scanf”的返回码,它将等于EOF常量
在“文件结束”之后,当您从fifo读取所有数据时,尝试读取内容,
“阅读”代码将立即返回并报告“文件结束”。