linux - 存在 FIFO 问题的输入循环

标签 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 本身。

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

谢谢!

最佳答案

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

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

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

关于linux - 存在 FIFO 问题的输入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14179994/

相关文章:

bash - 过滤文本文件以根据第 3 列中的值获取唯一条目

bash - 仅抓取文件所有行中第四个和第七个下划线之间的文本/子字符串

linux - 用于查找子字符串出现次数的 Shell 脚本

bash - 将所有脚本参数复制到另一个变量

linux - 如何记录 Linux 文件系统中的每日更改?

java - 通过java在linux中的终端上执行命令

linux -/etc/hosts 和本地 .dev 域的问题

git - bash - 引号中的变量

c# - 尝试从 Chrome 实现拖放 Gmail 附件

c++ - 未定义对 `i2c_smbus_read_block_data(int, unsigned char, unsigned char*)'的引用