我在使用 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 本身。
有人可以提供任何见解吗?
谢谢!
最佳答案
情况很简单,之后:
'echo 1 > input.fifo',文件'input.fifo'被打开,“1”被写入其中,
并且它已关闭。
问题是它已关闭。当 fifo 从写入端关闭时,这相当于读取端的“文件结束”。因此,如果您在 C 示例中检查“scanf”的返回代码,它将等于 EOF 常量。
在“文件结束”之后,当您从 fifo 读取所有数据并尝试读取某些内容时,
“读取”代码总是立即返回并报告“文件结束”。
关于linux - 存在 FIFO 问题的输入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14179994/