Webアプリ開発事始 第8回

CGIの仕組みを覗く(1)~基本原理とSSIによるアクセスカウンタ 長谷川裕行
有限会社 手國堂

入出力の切り替え

プログラムの入力と出力は、標準以外のものに切り替えることができます。これによって、データの流れを自在に制御できます。


- データとファイル -

コンピュータにつながったキーボードやディスプレイなどの機器は、すべてOSによって管理されています。プログラムが直接ディスプレイへ信号を送ったりしている訳ではありません。

UNIXは、あらゆるデータをファイルとして扱います。キーボードもディスプレイもプリンタも外部の通信機器も、すべてディスク上のファイルと同じように扱うのです。扱い方が同じなのですから、入力をキーボードからディスクファイルへ、出力をディスプレイから通信機器へ…と、切り替えることも可能です。

プログラムに対する入出力のデータ形式は、概念上ディスク上のファイルと同じものです。そのため、入力と出力を自在に切り替えられます。catというプログラムで、その概念を説明しておきましょう。


- ファイルとディスプレイを切り替える -

catは、ファイルの後ろに別のファイルの内容を付け足します。例えば

  cat abc.txt xyz.txt

とすると、abc.txtというファイルの最後尾にxyz.txtの内容が付け足されます。

 catは、単に

  付け足すファイル(例ではxyz.txt)の内容を読み込み(入力)
  付け足されるファイル(例ではabc.txt)の最後尾に送り出す(出力)

という動作をしているに過ぎません。そのため、以下のような形でファイルの内容をディスプレイに表示することもできます。

  cat xyz.txt

こうすると、xyz.txtの内容はディスク上のファイルの最後尾ではなく、ディスプレイへと送られます。catが、

  送り先を省略すると、ファイルの内容を標準出力へ送る

ように設計されているためです。


- リダイレクト -

この仕組みを利用すれば、プログラムへのデータの与え方(入力)、処理結果の受け取り方(出力)を自在に制御できます。そのための手段を「リダイレクト(redirect)」と言います。

リダイレクトでは、コマンドラインに<と>の記号を使います。<がプログラムに対する入力元、>が出力先を示します。

UNIXでよく使われる手法としては、

  たくさんの情報を記録したファイルから
  必要なものだけを抜き出して
  別のファイルを作る

という操作があります。

ファイルの中から指定した文字列を含んだ行を探して表示する、grepというプログラムがあります。

 grep 文字列 ファイル名

とするのが普通の使い方で、abc.txtから“computer”という語を探すなら

  grep computer abc.txt

とします。その結果“computer”という単語を含んだ行がディスプレイに表示されます。この場合の入力はキーボードから入力された“computer”と“abc.txt”で、処理結果は標準出力となるディスプレイへ送られています。

 ここで

  grep computer abc.txt > test.txt

という形でgrepを実行すると、grepの処理結果はtest.txtというファイルに書き込まれます。


図3:リダイレクトで入出力を切り替えられる



- パイプ -

CGIとは関係なくなりますが、リダイレクトに関連する機能として、パイプを紹介しておきましょう。

リダイレクトはプログラムの入出力を切り替える機能で、入力と出力はファイルとして扱われました。パイプは、あるプログラムの出力をファイルではなく、直接他のプログラムに送るための機能です。

パイプには“|”記号を使います。UNIXでよく使われるパイプ処理に、

  あるプログラムが、現在起動中かどうかを確かめる

という操作があります。

現在起動しているプログラムは、psというプログラムによって調べられます。psにaxオプションを付けると、実行中のすべてのプログラムとその実行状況が、ディスプレイに表示されます。

[taro@nancy taro]$ ps ax
PID TTY STAT TIME COMMAND
1 ? S 0:09 init
2 ? SW 1:26 [kflushd]
3 ? SW 11:48 [kupdate]
4 ? SW 0:00 [kpiod]
5 ? SW 1:06 [kswapd]
200 ? S 0:00 portmap
247 ? S 29:08 syslogd -m 0
258 ? SW 0:02 [klogd]
272 ? S 0:10 crond
285 ? SW 0:00 [cardmgr]
307 ? S 1:57 inetd
:

この中からインターネット接続を司る“inetd”というデーモンプログラムが起動されているかどうかを知るには、以下のように入力します。

[taro@nacy taro]$ ps ax | grep inetd
307 ? S 1:57 inetd
26252 pts/0 S 0:00 grep inetd

本来ディスプレイへ送られるpsの処理結果を、パイプを使ってgrepに送ります。grepでは、先に示したpsの処理結果(すべてのプログラムの起動状況)を受け取り、その中から、“inetd”という文字列を含む行だけを抜き出します。

パイプは、リダイレクトを使って入力と出力を切り替える機能です。


図4:パイプの仕組み



- CGIと入出力の切り替え -

このように、OS自身がプログラムの入出力を自在に切り替える仕組みを持っているため、プログラムは独自に入出力の機能を用意する必要がなくなります。

一般のコンソールモードで動作する小さなプログラムは、

  標準入力からデータを受け取り
  処理結果を標準出力へ送る

という仕様になっています。あとはコマンドラインからリダイレクトやパイプを使って、他のプログラムの処理結果を受け取ったり、自身の処理結果をファイルに書き込んだりできます。

CGIプログラムも、この仕組みを利用して動作します。


- 目次 -
CGIの基本原理
標準入力と標準出力
入出力の切り替え
データとファイル
ファイルとディスプレイを切り替える
リダイレクト
パイプ
CGIと入出力の切り替え
CGIとSSI
アクセスカウンタの仕組み
あとがき

Copyright © GrapeCity inc. All rights reserved.