パイプ (コンピュータ)

パイプ (コンピュータ)の最新ニュースをまとめて検索!


パイプ(pipe)とは、UNIX で実現された、プログラム同士を組み合わせて利用するための一手法の名称である。パイプラインpipeline)ともいう。このアイデアは、MS-DOS をはじめとする様々な OSアプリケーションに受け継がれている。

以下が典型的なパイプの利用例である。|(バーティカルバー) はシェルにパイプを指示する記号である。

List. 1

grep 札幌市 Address.txt | a2ps | lpr 

これは

  1. ファイル Address.txt から "札幌市" が含まれる行を出力し
  2. その出力を入力として受け取って a2ps コマンドを用いて整形し
  3. その出力を印刷する

といった流れを示したものである。以下も同じ処理を行う手続きであるが、

List. 2

grep 札幌市 Address.txt > sapporo.txt
a2ps < sapporo.txt > print.ps
lpr < print.ps

このような中間ファイルを利用する方法より、簡潔な記述とすばやい動作が期待できる。

List. 2 では、1 つ目のプログラムが完全に終了して初めて 2 つ目のプログラムが動き出し、2 つ目のプログラムが終了して初めて 3 つめのプログラムが動き出すが、List. 1 では、可能であれば 3 つのプログラムがマルチタスクにより同時に動く。また、データの受け渡しはファイルではなくメモリ上で行われる。このため、一般的に List. 2 よりも List. 1 の方が高速である。ただし、MS-DOS はシングルタスク OS であるため、List. 1 のように指示しても内部で中間ファイルが作られるので、実際には List. 2 を指示したのと同じ意味になる(処理が終われば中間ファイルは MS-DOS により削除され、ユーザには何もなかったように見える)。

UNIX の思想のバックボーンには、それぞれの役割に特化したプログラムを組み合わせ、複雑な機能を実現する(ツールキットアプローチ、分割統治法)がある。パイプはその典型であり、UNIX を利用する大きな魅力のひとつとなる。

[編集] プログラムによるパイプの作成

パイプはプログラムの制御の下で作成することもできる。pipe() システム・コールオペレーティング・システムに新しいパイプ・オブジェクトを生成するように要求する。この結果、2つの新しいファイル記述子が開かれ、プロセスに渡される。つまり、読み取り専用のパイプの口と書き込み専用のパイプの口である。これらパイプの口は、シークができないことを除けば、匿名の通常のファイルとして現れる。

デッドロックを避けたり並列処理をしたりするために、1つまたはそれ以上の新しいパイプをもつプロセスは、新しいプロセスを生成するのに、一般的に fork() を呼び出す。それぞれのプロセスは、データを作り出したり利用したりする前に、使われることのないパイプの口を閉じるだろう。または、最初のプロセスが単純に新しいスレッドを生成し、ただひとつのスレッドがひとつのパイプの口の利用を保証するようにするという方法もある。

[編集] 名前付きパイプ

名前つきパイプ(named pipe)とは、パイプの考え方を一般に延長したプロセス間通信の一手法である。プロセス同士があるストリームを共有し、互いに読み書きを行う事で協調的な動作を行う。

Windowsでは、名前付きパイプをマシン内に作成するサーバ側は、CreateNamedPipe() で「\\.\pipe\パイプ名」という形式の名前で作成し、パイプにつなぐクライアント側はファイルの読み書きと同じ操作で読み書きすることが出来る。また、Windows における匿名パイプは、ランダムな名前の名前付きパイプとして実装されている。

POSIX(UNIX)では、名前つきパイプは mkfifo() または mknod() によって作成され、入力あるいは出力ファイルとして利用できるように、プログラムに渡される。

マシン間の通信にも名前付きパイプを利用することが出来るが、データを送るたびに、通信確認のためのデータが行き来するので、他のマシンと大量のデータを通信するときは、ソケットの方が高速である。ただし、マシン内のプロセス間通信の場合は、Windowsではカーネル内で動作するので名前付きパイプは高速である。

[編集] 関連項目

最終更新 2009年9月5日 (土) 14:55 (日時は個人設定で未設定ならばUTC)。
【パイプ (コンピュータ)】変更履歴

ご利用上の注意