2012-04-13 5 views
1

p00のコードでは、mkfifo p00で作成された名前付きパイプです。利用可能な場合は、stdinから行を読み込む方法(そうでない場合はブロックする)?

は、コンソール1において、Iは走っ:

% perl -ne 'print "PERL: $_"' < p00 

そして、一方、上記Iは結果

% seq 3 > p00 

を実行したコンソール2に、(予想通り)ブロックされ、コンソールに登場以下1:

PERL: 1 
PERL: 2 
PERL: 3 
% 

これは、私がホップを持っていたほとんど結果でした第3行を印刷した後にperlスクリプトが終了したという点を除いて、達成するために実行されました。

私は、スクリプトが(「PERL:」で始まる)ラインエコー続けたいそうでないとすぐに、彼らが利用可能になるとしてを、そしてブロック

ワンライナーの次の変異体は、上記表面的に希望の動作に似ている:

perl -e 'while (1) { print "PERL: $_" while <>; sleep 1 }' < p00 

を...しかし、入力を待っている間に、それはブロックされませんので、それは、本物ではありません、それが利用可能になるとすぐに入力をエコーし​​ません。

NOTES:

  1. この質問の背後にある動機は、教育(鉱山、つまり)との何物でもあり、実際の問題を解決しようとはしていません。私はもっ​​と多くのperl(とunix)を学ぼうとしています。
  2. この質問がunix.se.comに適しているかどうかはわかりませんでした。それがあれば私はそこにそれを再投稿するよりも嬉しいです。私に知らせて。
+4

これは 'fifo'が動作する方法です:ライターがそれを閉じると、リーダーは' EOF'を取得します。読者はおそらく 'fifo'を再オープンする必要がありますが、シェルのリダイレクトではできません。 –

+0

@MaximYegorushkin:あなたのコメントは、私がしなければならなかったことが、「睡眠1」を取り除くことでした!その後、私が投稿した第2のバージョンは、まさに私が望むものです。ありがとう! – kjo

答えて

1

Maxim Yegorushkinのコメントを読んだ後、私がしなければならなかったことは、第2版でsleep 1を取り除くことだと分かりました。すなわち、これは私が欲しいものを正確に行います。マキシムが書いたように

perl -e 'while (1) { print "PERL: $_" while <> }' < p00 

、内側のループはEOFを受信したときに終了します。外部ループはスクリプトをブロッキング状態に戻し、入力を待つ... Doh!

+2

それは面白いです。 'p00'がFIFOではなくファイルであるとします。その後、改訂されたスクリプトはファイルに追加された余分な行を読み込みます( '>>'で追加するか、ファイルを書き直して以前よりも多くの行を追加します)。したがって、Perlは、新しい読み込みの前に入力ストリーム(標準入力)のEOFインジケータをリセットしています。 –

関連する問題