パイプはすでにシェルの機能のところで見てきた通信機能ですが、制限があ ります。主に親子のプロセスの間で使われる、歴史的には最も古いプロセス間 通信の方法です。パイプは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つ開いて片方を親から子へもう一 方を子から親へと決めて使わなければなりません。