開発日記-20190823 linuxの名前付きパイプFIFOの間で、プロセス間通信

オリジナルリンク: https://www.cnblogs.com/qingergege/p/9489682.html

そして、感謝の気持ちで再現:Linuxの名前付きパイプFIFOの間で、プロセス間通信

それは限りすることができますように、ファイルシステムに存在するが、そのようFIFOプロセスとの遺伝的関係を作成するプロセスが存在しない場合でも、FIFOファイルの形で、それに関連付けられたパス名を提供することで名前付きパイプ(FIFO)は、名前パイプは異なりますアクセスパスは、FIFOを介して互いに通信することが可能であり、したがって、FIFO無関係なプロセスを介してデータを交換することができます。

名前付きパイプ(FIFO)と名前なしパイプ(パイプ)は、特性のいくつかは、同じではなく、同じ場所ですがあります。

図1に示すように、FIFOは、特別なファイルとしてファイルシステムに存在するが、内容がFIFOメモリに保存しました。

図2は、プロセスがFIFOを使用することを終了するとき、FIFOは、後で使用するためにファイルシステム内のファイルを保存していきます。

図3は、FIFOは名前を有し、無関係のプロセスが名前付きパイプを開くことによって通信することができます。

パイプラインを作成するため、int型はmkfifo(のconstのchar *のパス名、mode_tモード)

int型オープン(のconstのchar *のパス名、int型のフラグ);開放するための導管

オープンFIFOファイルと通常のファイルは、2点の違いがあります。

最初のファイルの読み取りおよび書き込み操作をO_RDWR FIFOモードで開かれていません。そのような行動が定義されていますか。

我々は、データのみの一方向の伝送のために、通常はFIFOを使用するので、このモードを使用する必要はありませんので。

あなたは一つの方向を使用して、双方向のプログラム間のデータの転送、または好ましくはFIFOパイプラインのペアが必要です場合。閉じたり、データフローの方向を変更する明確なFIFOを再開するために用いられる方法です。

第二は、フラグO_NONBLOCKオプションを使用することです。

唯一のオープンコールは、だけでなく、読みや要望を書き込むためにオープン呼び出しによって返されたファイルディスクリプタの扱いを変更する方法を変更するには、このオプションを使用します。

O_RDONLY、O_WRONLYおよびO_NONBLOCKフラグ4つの正当な組み合わせがあります。

フラグ= O_RDONLY:同じFIFOを書くためのプロセスを開くために別の方法がない限り、オープンコールが、それ以外の場合は、待っている、ブロックされます。
フラグ= O_WRONLY:同じFIFOを読むためのプロセスを開くために別の方法がない限り、オープンコールが、それ以外の場合は、待っている、ブロックされます。
フラグ= O_RDONLY | O_NONBLOCK:この時点でFIFOを書くためのプロセスを開くために他の方法がない場合は、この時間は、読み込まれるFIFOを開くには、この時間が成功したリターンを開き、エラーを返しません。
フラグ= O_WRONLY | O_NONBLOCK:この時点では、オープンを開くために失敗読み取るためのプロセスをオープンする方法が他にない場合は、すぐに戻り、その後、FIFOが開いていない、それは-1を返します。
関数呼び出しのパラメータフラグO_NONBLOCKがFIFO読み取りおよび書き込み操作に影響開きます。

次のようにルールは以下のとおりです。

データは、それが/実行を継続したときに読むことができるようになるまで待つことになる空のFIFOのブロックへの呼び出しを読んで
すぐに0バイトを返し、空の非ブロックFIFOへの呼び出しをお読みください。
データのみを始めるに書き込むことができるようになるまで、FIFO書き込みコールの完全閉塞を待ちます。
システム要件:データ長が以下のPIPE_BUF書き込まれたバイトである場合、すべてのバイトやバイトを書く、あるいはません。
この制限効果ことに注意
FIFOは異なるプログラムからデータ・ブロックを確保するために、時刻を読み取る場合にのみFIFと異なる複数のプログラムは、送信要求を処理することを可能にするが、相互に互い違いではない、すなわち、各アトミックオペレーション、この制限非常に重要。すべてのパンは、書き込み要求に送信することができる場合はFIFOのブロッキング、各要求データ長親PIPE_BUFバイト以下を書き込み、システムは、データが絡み合っされないことを保証することができます。FIFOは、通常、各データ長を通過することは良いアイデアですPIPE_BUFに限定されています。

FIFOは、以下の規則に従って書かれたすべてのデータを受信していない場合、非ブロッキング書き込みコールの場合には、:
書き込まれるように要求されたデータの長さは、データを書き込むことができない、呼び出しが失敗し、PIPE_BUFバイトよりも小さくなっています。
書き込まれるように要求されたデータの長さは、データ書き込み部PIPE_BUFバイトよりも大きい場合、戻り値はゼロであってもよいし、実際に書き込まれたバイト数を返します。
ゼム。PIPE_BUFはlimits.hにヘッダファイルに定義されているFIFOの長さです。Linuxまたは他のUNIXライクなシステムでは、その値は通常4096バイトです。

おすすめ

転載: blog.csdn.net/qq_31433709/article/details/100026292