next up previous contents
Next: メッセージ Up: プロセス間通信をする Previous: プロセスの生成

パイプ

パイプはすでにシェルの機能のところで見てきた通信機能ですが、制限があ ります。主に親子のプロセスの間で使われる、歴史的には最も古いプロセス間 通信の方法です。パイプはFIFO(First In First Out)バッファを持つ入出力と してとらえることが出来ます。 まず単一のプロセスの中で使ってみましょう。

        int     fileds[ 2 ];



        if( pipe( fileds ) == -1 )

        {       /*戻り値が-1の時はエラー*/

        }

pipeシステムコールを呼びます。整数配列の要素fileds[0]が読み出しチャン ネルのファイル記述子を、fileds[1]は書き込みチャンネルのファイル記述子 を表わします。8.1.2で見たwriteシステムコールでfileds[1]に書き込んだデー タがfileds[0]へのreadシステムコールで読みだせるわけです。これだけでは あまりおもしろくありません。

ここでforkシステムコールを使って子プロセスを生成します。この場合それ ぞれのプロセスのfiledsは共通のFIFOバッファへのチャンネルとなりますから、 親プロセスがfileds [1]に書き込んだデータを子プロセスがfileds[0]から読 みだせることになります。また逆に子プロセスがfileds[1]に書き込んだデー タを親プロセスがfileds[0]から読みだすことも出来るわけです。次の例を見 てみましょう。

        int     fd[ 2 ], buf[ 256 ];



        if( pipe( fd ) == -1 )

        {       /* -1のときはエラー */  }

        if( fork( ) != 0 )

        {       /* 戻り値が0でないのは親の方 */

                write( fd[ 1 ], buf, 1024 );

        }

        else

        {       /* こちらは子プロセス */

                read( fd[ 0 ], buf, 1024 );

        }

ただし、FIFOバッファは一つしかありませんから、親が書き込んだ後自分で読 みだすと(子が読んでいなければ)自分の書いたデータが読めてしまいます。親 子が双方向の通信をするためにはパイプを2つ開いて片方を親から子へもう一 方を子から親へと決めて使わなければなりません。



next up previous contents
Next: メッセージ Up: プロセス間通信をする Previous: プロセスの生成



Kinya Hibino
Sun Jan 14 21:36:40 JST 1996