2013-01-06 108 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