web-dev-qa-db-ja.com

バッファリング(名前付き)パイプGNU OS

GNU OSでは、プロセスは、別のプロセスが同じデータを(同じパイプから)同時に読み取る場合にのみ、パイプにデータを書き込むことができます。

1番目のプロセスがデータを書き込み、2番目のプロセスがそれを読み取るまでデータをバッファーするパイプのようなものはありますか?

9
Al Klimov

名前付きパイプ(fifo)は、必要なことをある程度実行できますが、いくつかの注意点があります。

  1. リーダーが存在する前にパイプに書き込むことができるようにするには、ライターが読み取り/書き込みとしてfifoを開く必要があります。そうしないと、openの呼び出しがブロックされます。シェルでは、次のようになります。

    exec 3<>/path/to/pipe
    echo "foo" >&3
    cat <&3
    

    ご覧のとおり、読者が来る前にパイプに書き込むことができます。パイプから読み取ると、書き込んだメッセージはすでにそこにあります。

  2. パイプがいっぱいになると、パイプへの書き込みは最終的にブロックされます。 Linuxでは pipe(7) によると:

パイプの容量は限られています。パイプがいっぱいの場合、O_NONBLOCKフラグが設定されているかどうかに応じて、write(2)がブロックまたは失敗します(以下を参照)。実装によって、パイプ容量の制限が異なります。アプリケーションは特定の容量に依存しないでください。アプリケーションは、読み取りプロセスが利用可能になるとすぐにデータを消費し、書き込みプロセスがブロックされたままにならないように設計する必要があります。

2.6.11より前のLinuxバージョンでは、パイプの容量はシステムページサイズと同じでした(たとえば、i386では4096バイト)。 Linux 2.6.11以降、パイプ容量は65536バイトです。

ユースケースによっては、メッセージキューの使用を検討することもできます。カーネルはメッセージキューを提供します。 Linuxでは、概要については mq_overview(7) を参照してください。または、RabbitMQのようなサービスは、ネットワーク全体で使用できるなど、さまざまな機能セットを備えたメッセージキューを提供します。

5
Steven D