2009-04-03 4 views
8

私は2つの別々のプロセスを持っています:コンマ区切りの値の後に1秒ごとに改行が続くCプログラムと、(同じフォーマットの)データを受け取り、このデータを処理するPerlプログラム。 (printf関数を介して)2つの並行プロセスが通信する方法を教えてください。

Cプログラムの出力のような値:

1, 2, 3, 4, 5, 6 
7, 8, 9, 10, 11, 12 
... 

Perlプログラムは、このデータを処理するためにSTDIN用ライン単位で待機している無限ループに座って:

while ($line = <STDIN>) 
{ 
    chomp($line) # Line should now read "1,2,3,4,5,6" 
    # Process data 
} 

私は、これらの2つのプロセスがリアルタイムで通信するようにします。 Perlプログラムは入力を処理する前に最初のプログラムが終了するのを待つので、標準のbashパイプは機能しません(例えばprocess1 | process2)。

誰にもこの問題の解決策に関するアイデア、提案、または洞察力がありますか?前もって感謝します!

+0

は、厳密に言えば、これはあなたが絶対的に正しい – andersoj

+0

「リアルタイム」とは何の関係もありません、私は急いでこれを書いて、私はこれらのプロセスが動作するように望んでいた方法を説明するためのより良い方法を考えることができませんでした。コンカレントがより良い選択だったかもしれません。 –

+0

Concurrentははるかに優れており、修正するための編集ボタンがあります。 – derobert

答えて

16

パイプはこれで問題ありません。 Cプログラムの出力をフラッシュしてperlスクリプトがインクリメンタルに使用できるようにするときは、制御する必要があります。これは、Cプログラムでfflush()を使って行うことができます。これは、Cプログラムのバッファを強制的にプルして、perlプログラムがそれを読むことができるようにします。

perlプログラムが出力を処理する前にCプログラムが書き込みを終了するのを待たせるようなパイプは何もありません。それは一度にSTDIN 1行処理されるようにあなたのPerlプログラムが書き込まれます。この文脈で

while ($line = <STDIN>) { ... } 

<>STDINから1行を読み込みますが、利用できる1がない場合は、1つになるまでそれがブロックされます。 Cプログラムからfflush()を呼び出すと、これが実行されます。

Wikipedia article on Pipelinesをご覧ください。実装セクションでは、パイプがどのようにバッファされているかを簡単に説明します。これは、プロセスの通信方法を理解するのに役立ちます。パイプdoは、プロセス間の並行性を可能にし、パイプの読取りおよび書込みプロセスは、他のプロセスと同様にスケジューラによって管理されます。あなたの問題は、バッファリングにあります。

+0

私はCプログラムが改行を印刷するたびにすべての出力をフラッシュしたと思っていました。 –

+0

あなたはこの答えで正しかったです。私はfflushを調べたこともありましたが、私はstdoutで使用することは考えていませんでした。そして、perlプログラムの振る舞いの性質上、私はcプログラムで「待っている」と誤解していました。私はprintfステートメントの後にfflush(stdout)を追加しましたが、完璧に機能しました!ありがとう!! –

+0

@Chris Lutz、自動フラッシュは、ストリームがラインバッファモードにある場合にのみ発生します。これは通常、ストリームがtty上で開いている場合にのみ真です。 stdoutがパイプになると、デフォルトで完全にバッファリングされて最高のパフォーマンスが得られます。 – RBerteig

5

Cプログラムは、出力バッファを明示的にfflush()するか、またはptyを使用する必要があります。後者ははるかに扱いにくいですが、Cコードは単純です。これはあなたに慣れていない場合は、 "男3 fflush"を試してください。

+0

ptyの使用は過剰です。 Cコードでstdioを使用する場合は、出力をフラッシュすることが重要です(write()を直接使用する場合は重要ではありません)。 2つのプロセスが相互に作用しなければならない場合 –

+0

PTYにのみ必要であり、その後、本当に場合にのみ、一方または両方は、相互作用する当事者としての非ヒトを有することに気づかなければなりません。 Ptysは、UNIXのようなプラットフォームの外ではあまり移植性がありません。 – RBerteig

+0

私はptyが残虐であることに同意しますが、改行が終わるたびにCプログラムが自動終了するようにします。その意味で(そしてその意味だけで)、Cプログラムはより複雑な環境を犠牲にしてより簡単になります。 –

関連する問題