2017-03-04 1 views
0

私はLinux上にあり、当初はfifoファイルの場合、ライターがその中にいくつかのコンテンツをダンプすると、そのライターはそのコンテンツを "すべて"読み込んで返してくれるのを待っています。しかし、私は期待通りではないようだ、私は簡単な実験だった:私は "いくつかのラインを有する、「my.txt」ファイルを持っていたその後linux fifo、readピアが返ってくると、write peerもすぐに戻りますか?

$mkfifo hfifo.txt 

:すべての

まず、私は、FIFOファイルを作成しました:

$cat my.txt 
line1 
line2 
line3 
line4 

私はmy.txtとhfifo.txtへの書き込みに "TTY1" を開きます。

cat my.txt >hfifo.txt 

私が読むために、他の端末 "tty2" を開きますそれからe線:仕上げを「読み取り」として私suppriseによく

$read l1<hfifo.txt 

、私の「TTY1」の「猫」もすぐに戻ります。私は "$ l1をエコーする" "line1"を印刷します。私は、読者ピアがFIFOに書かれているすべてのコンテンツを読んで、ライターピア(tty1)が戻ってくることを期待していたので、これは私にとって非常に奇妙です。しかし、実際の結果は、リーダ・ピアが終了すると、ライタ・ピアも終了します。

は、私はちょうど好奇心

(1)どのようにライターピアは、それが終了したので、FIFOを読むためにこれ以上の読者がないことを知っていますか?私はこのファイルの各行を印刷するために "read"コマンドを呼び出すループに入るかもしれません。

(2)fifoをダンプするリーダーとしての "cat"コマンドの横に、このFIFOを1行読み込む方法がありますか?

感謝を申し出てください。

答えて

1

'strace'が便利です。あなたは+改行3つの文字でファイルの次の行を見ることができます:

read(3, "qqq\n", 131072) = 4 write(1, "qqq\n", 4) = 4 read(3, "", 131072) = 0

は、あなたが見ることができるように、両方の読み取り()とwrite()読みの文字数を返し、最後interationリターンゼロにプロセスが終了したことを通知する。

regardins(2)sed awkやegrepのように、ファイルを1行ずつ読み込むだけのコマンドがありますが、ファイルAFAIKのみを読み込むようにしています。

関連する問題