0

我在为标准输入使用 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 本身。

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

谢谢!

4

1 回答 1

0

情况很简单,在:
'echo 1 > input.fifo'之后,文件'input.fifo'被打开,“1”被写入它,
它被关闭了。

问题是它是关闭的。当 fifo 从写入端关闭时,这相当于读取端的“文件结尾”。因此,如果您在 C 示例中检查“scanf”的返回码,它将等于 EOF 常量。

在“文件结束”之后,当您从 fifo 读取所有数据并尝试读取某些内容时,“正在读取”代码将立即返回并报告“文件结束”。

于 2013-01-06T08:33:49.217 回答