2013-01-06 71 views
0

我在使用FIFO作为stdin时遇到了一些麻烦。带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错误。发送到脚本后,某些内容不会被清除。

我试图用一个C程序同样的事情用一个类似的输入循环使用的scanf(“%d” ......),并担任这样的:

$ echo 1 > input.fifo 
Got: 1 
Got: 1 
Got: 1 
Got: 1 
etc. 

所以它似乎是最后一个FIFO中的东西卡在那里。在ruby示例中,它是一个空行,因为获得了\ n。在第二个它是1本身。

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

谢谢!

回答

0

的情况很简单,后:
'回响1> input.fifo',文件 'input.fifo' 被打开了, “1” 被写入其中,
并且它是封闭的。

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

当你从FIFO中读取所有数据并尝试读取数据时,“读取”代码将立即返回并报告“文件结束”。

+0

嗯,也许我正在使用错误的工具。基本上我想要一些东西让我能够将用户输入引导到脚本,并让脚本在没有更多输入时等待。当其他东西被添加到输入文件时,我想执行下一行。任何想法我可能会这样做? – user1222728