GNU OSのバッファ付き(名前付き)パイプ

GNU OSのバッファ付き(名前付き)パイプ

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

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

ベストアンサー1

名前付きパイプはある程度必要な操作を実行できますが、いくつかの注意事項があります。

  1. リーダーが存在する前にパイプに書き込むことができるようにするには、作成者が読み書きするためにFIFOを開く必要があります。それ以外の場合、コールはブロックopenされます。シェルでは、次のように見えます。

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

    ご覧のとおり、リーダーが来る前にパイプにデータを書き込むことができます。パイプからデータを読むとすぐに、私が書いたメッセージはすでにそこにあります。

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

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

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

ユースケースに応じて、メッセージキューの使用を検討することもできます。カーネルはメッセージキューを提供します。 Linuxでは、以下を参照してください。mq_概要(7)良い概要を得るために。あるいは、RabbitMQなどのサービスは、ネットワーク全体の使いやすさなど、さまざまな機能セットを含むメッセージキューを提供します。

おすすめ記事