0

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 に何か問題があるということです。スクリプトに送信された後、何かがクリアされていないこと。

scanf("%d" ...) を使用して同様の入力ループを持つ C プログラムで同じことを試みたところ、次のように動作しました。

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

そのため、FIFO の最後のものがそこに詰まっているように見えます。ruby の例では、gets が \n をキャプチャするため、空行です。2 番目は 1 そのものです。

誰でも洞察を提供できますか?

ありがとう!

4

1 に答える 1

0

状況は単純です。
「echo 1 > input.fifo」の後、ファイル「input.fifo」が開かれ、「1」が書き込まれ、
閉じられます。

問題は、それが閉じていることです。書き込み側から fifo がクローズされた場合、これは読み取り側の「ファイルの終わり」と同じです。したがって、C の例で「scanf」からの戻りコードを確認すると、EOF 定数と等しくなります。

また、「ファイルの終わり」の後、fifo からすべてのデータを読み取り、何かを読み取ろうとすると、「読み取り」コードは常にすぐに戻り、「ファイルの終わり」を報告します。

于 2013-01-06T08:33:49.217 に答える