ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
あるタスク(またはプロセスやスレッド、以下同)の出力と、別のタスクの入力を接続する機能。
UNIXにおいて、具体的にパイプがどのように実現されているかというと、その正体はプロセス間通信である。
そもそも、パイプも入出力に関連する機能ではあるが、異なるプロセスで同じ入出力を共有するようなことは出来ない。従って、オペレーティングシステムが仲介し、双方をプロセス間通信で接続しているのである。
UNIXでは、ステムコールpipe()でこれをおこなう。pipe()を呼び出すと、メモリー上にバッファー領域が作られ、この領域を介して二つのプロセスが通信する。この領域はオペレーティングシステムによってファイルとして扱われるため、あたかも通常のファイルを読み書きするかのようにアクセスすることができる。
シェルがパイプ機能を実現するためには、標準入出力の切り替えをする。これによってアプリケーションは、パイプかどうかをあまり意識する必要なく、標準入出力へのアクセスをするだけで、目的が達成される。
しかしこの機能を実現するためには、やや複雑な機構が必要となる。
パイプは、出力先が別のコマンドになる。シェルからは複数のプログラムを実行する必要が生じるが、exec()などのシステムコールではプロセスが実行したコマンドで置き換えられてしまうために、複数のコマンドの入出力を繋げる処理が実現できない。そこでシェルはfork()をして子プロセスとして生成し、ここで出力先のコマンドを実行している。子プロセスには親プロセスのファイルディスクリプターが複写されているため、それを利用できるのである。
こうしてfork()後、出力側は標準出力、入力側は標準入力をそれぞれclose()し、pipe()で得たfdをdup()に与えて標準入出力に切り替えることになる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます