C プログラム (パイプ処理)

Unix/Linux系 OS におけるパイプ (pipe) は,プロセス間通信に使用できる単方向のデータチャネルです.パイプの書き込み側に書き込まれたデータは,パイプの読み出し側から読み出されるまでカーネルでバッファリングされます.

パイプはシェルからコマンドの入出力として利用できますが,プログラムでも生成できます.pipe() システムコールは (匿名の) パイプを生成します. このとき,2つのファイル記述子が生成されプロセスに渡されます. パイプの配列 (pipefd) が,パイプの両端を参照する2つのファイル記述子を返すのに使用されます.pipefd[0]がパイプの読み出し側,pipefd[1]がパイプの書き込み側です.

書き込み用のパイプと読み出し用のパイプを異なるプロセスが持つことで,ストリームを共有し協調的な動作を行わせることができます.これは fork した親子関係にあるプロセス間のプロセス間通信で使われます.

パイプによるプロセス間通信1

パイプを使うサンプルプログラムです.親プロセスから子プロセスへの通信を行います.ソースプログラムは,pipe_test1.c です.

プログラムはコマンドとして起動するもので,仕様は以下です.

 pipe_test1 string
  パラメータ:
    string : パイプに書込む文字列
 

プログラムは,以下の機能を実行します.

  1. pipe() を実行し,パイプを作成する.
  2. fork() を実行し,子プロセスを生成する.子プロセスは同じパイプを参照するファイル記述子集合のコピーを継承する.
  3. 各プロセスはパイプ処理に使用しないファイル記述子をクローズする.
  4. 親プロセスは指定された文字列をパイプへ書き込む.
  5. 子プロセスはパイプから1バイトずつ読み込んみ標準出力にエコーする.
  6. 親プロセスは,子プロセスの終了を待って終了する.

パイプによるプロセス間通信2

パイプを使うサンプルプログラムです.親プロセスから子プロセスが起動したコマンドの標準入力への通信を行います.ソースプログラムは,pipe_test2.c です.

プログラムはコマンドとして起動するもので,仕様は以下です.

 pipe_test2 string
  パラメータ:
    string : パイプに書込む文字列
 

プログラムは,以下の機能を実行します. 子プロセスのパイプを標準入力に繋ぐと,親プロセスがパイプに書き込んだものを子プロセス,または子プロセスから起動したプログラムが標準入力から読み込むことができます.

  1. pipe() を実行し,パイプを作成する.
  2. fork() を実行し,子プロセスを生成する.子プロセスは同じパイプを参照するファイル記述子集合のコピーを継承する.
  3. 各プロセスはパイプ処理に使用しないファイル記述子をクローズする.
  4. 親プロセスは指定された文字列をパイプへ書き込む.
  5. 子プロセスは,ファイル記述子複製関数 dup2() を使って子プロセス側のパイプの読み込みを標準入力へ複製し,パイプはクローズする.
    これにより,親プロセスがパイプに書き込んだデータが子プロセスで起動したプログラムの標準入力から読み込めるようになる.
  6. 子プロセスは,execl()を使って cat コマンドを起動し,標準入力からデータを読み込む.
inserted by FC2 system