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