【问题标题】:Input loop with FIFO problems具有 FIFO 问题的输入循环
【发布时间】:2013-01-06 06:42:24
【问题描述】:

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

谁能提供任何见解?

谢谢!

【问题讨论】:

    标签: linux bash shell redirect fifo


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗯,那我可能用错了工具。基本上,我想要一些允许我将用户输入定向到脚本的东西,并让脚本在没有更多输入时等待。当其他内容添加到输入文件时,我想执行下一行。知道我该怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2023-03-14
    • 2021-05-07
    • 2013-07-01
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多