10

非ブロッキング/非同期の名前付きパイプまたはシェルで同様のものを作成する方法はありますか? プログラムが行を配置できるように、それらの行はRAMに留まり、一部のプログラムがパイプからいくつかの行を読み取ることができたときに、読み取らなかったものをFIFOに残しますか? また、プログラムがこの fifo に同時に書き込みと読み取りを行う可能性も非常に高くなります。最初はファイルを使用してこれを行うことができるかもしれませんが、Web を少し検索した後、ファイルが同時に読み書きされるという事実からは何も得られないようです。名前付きパイプはほとんど機能しますが、2 つの問題があります。1 つ目は、反対側に誰もいない場合に読み取り/書き込みをブロックすることです。各プロセスで1行を書き込もうとして、次に試してくださいhead -n 1 <fifo>必要に応じて 1 行だけ取​​得しますが、両方の書き込みプロセスが終了し、2 行目が失われます。助言がありますか?

編集:おそらく、これを支援するために、ライターとリーダーの間の仲介者のように機能する中間プログラムを使用できますか?

4

1 に答える 1

5

この目的のために特別なプログラムを使用できます - buffer. Buffer は、テープ ドライブへの書き込み時にストリーミングできるようにライター側を継続的にビジー状態に保つように設計されていますが、他の目的にも使用できます。内部的には、バッファは共有メモリに保持された大きな循環キューを介して通信するプロセスのペアであるため、プロセスは非同期で動作します。キューがいっぱいの場合はリーダー プロセスがブロックされ、キューが空の場合はライター プロセスがブロックされます。例:

bzcat アーカイブ.bz2 | バッファ -m 16000000 -b 100000 | 処理スクリプト | bzip2 > archive_processed.bz2

http://linux.die.net/man/1/buffer

于 2011-07-14T06:17:58.110 に答える