PHP,JSP,ASPなどでWebアプリケーションを作ったことがあっても,CGI(Common Gateway Interface)のプログラムをイチから書いた経験がある人は,それほど多くないでしょう。今回は,C言語でシンプルなCGIプログラムを作成・実行して,Webプログラミングの基本を体験してもらいます。なお,Webサーバーを起動すると,外部から不正にアクセスされる危険があります。実験が終わったら,すぐにWebサーバーを停止することをお勧めします。

実験の目的と準備

 今回の実験の目的は,CGIプログラムの作成と実行を体験することです。OSにWindows XP Professional,Webサーバー・ソフトにIIS(Internet Information Services)を利用します。皆さんがお使いのマシンにIISをインストールしてCGIプログラムを実行し,同じマシンのWebブラウザに実行結果を表示させます。

 まずIISをインストールします。Windows XP Professionalには,オプションとしてIISというWebサーバーが添付されています。IISをインストールしていない場合は,コントロール・パネルから「プログラムの追加と削除」を起動し,「Windowsコンポーネントの追加と削除」のリストにある「インターネットインフォメーションサービス(IIS)」にチェックマークを付け,WindowsのCD-ROMからインストールしてください。

 インストールが完了すれば,すぐにサービスとしてIISが動作します。Webブラウザを起動して,「http://localhost/」にアクセスすれば,あらかじめ用意されている「ようこそ」のWebページが表示されます。

 「localhost」は,自分自身のマシンを意味します。IISの設定と停止は,コントロールパネルの「管理ツール」から「インターネットインフォメーションサービス(以下,IIS管理ツールと呼ぶ)」を起動して表示されるウィンドウで行います。

実験の方法と結果

 リスト1に示したC言語のプログラムを作成し,MyCGI.cというファイル名で適当なディレクトリ(フォルダ)に保存します。特殊な関数は使っていませんので,どのようなCコンパイラでもコンパイルできるはずです。

#include <stdio.h>

int main() { printf("Content-Type: text/html\n\n");
printf("<HTML><HEAD><TITLE>\n"); printf("CGIのサンプル\n"); printf("</TITLE><HEAD>\n"); printf("<BODY><H1>\n"); printf("皆さん,こんにちは!\n"); printf("</H1></BODY></HTML>\n");
return 0; }
リスト1●C言語で作ったCGIプログラム

 コンパイルができたら,試しに一度実行してみましょう(図1)。リスト1にあるプログラムの内容からもわかる通り,このプログラムは,prinf( )関数を使って標準出力(画面)にHTMLなどの文字列を表示しているだけです。これが,CGIプログラムです。

図1●リスト1の実行例
図1●リスト1の実行例

 IISをインストールすると,デフォルトではC:\Inetpub\wwwrootというディレクトリが作成されます。このディレクトリが,Webサーバーのホーム・ディレクトリで,Webサーバにアクセスする人から見たルート・ディレクトリになります。ここでは実験ですから,ホーム・ディレクトリにCGIプログラムを配置することにしましょう。MyCGI.cをコンパイルして得られた実行ファイルMyCGI.exeを,C:\Inetpub\wwwrootにコピーしてください。

 CGIプログラムを実行するには,それが配置されたディレクトリに実行権限を与える必要があります。IIS管理ツールで「Webサイト」フォルダをクリックし,「既定のWebサイト」を右クリックして表示されるメニューから「プロパティ」を選んでください。「既定のWebサイトのプロパティ」というウィンドウが開いたら,「ホームディレクトリ」タブ・ページにある「実行アクセス権」で「スクリプトおよび実行可能ファイル」を選択して「OK」ボタンをクリックします。これで,設定は完了です。

 Webブラウザを起動し,

http://localhost/MyCGI.exe

と入力します。WebサーバーがMyCGI.exeを起動し,その出力をWebページに返します。実行結果は図2です。

図2●CGIプログラムによって出力されたWebページ
図2●CGIプログラムによって出力されたWebページ

 これで,実験は終了です。IIS管理ツールのウィンドウで「既定のWebサイト」をクリックし,「操作」メニューから「停止」を選んでサービスを停止しましょう。念のため,WebブラウザのURL欄に「http://localhost/」と入力し,「ページを表示できません」というエラー・メッセージが表示されることを確認しておいてください。

実験の考察

 CGIのIは,Interfaceという意味です。CGIは,Webサーバーとプログラムをつなぐインタフェースの規格なのです。IISやApacheなど一般に良く使われるWebサーバーは,どれもCGIをサポートしています。実験では,MyCGI.exeという単独で動作するプログラムを作り,それをWebサーバーであるIISに実行させたのです。MyCGI.exeは,標準出力にHTMLを出力します。Webサーバーは,その出力を画面ではなく,Webブラウザに送信します。

 CGIプログラムの先頭にあった

printf("Content-Type: text/html\n\n");

の内容は,CGIプログラムがどのような形式のデータを出力するのかを示すものです。“text/html”は,HTML形式のテキストを出力することを意味します。ほかの形式を指定することもできます。例えば,この部分をimage/gifにすればGIF形式の画像を出力するCGIプログラムを作成できます。

 逆に,WebブラウザがWebサーバーへ送る情報は,標準入力,コマンドライン引数,環境変数などを介して,CGIプログラムに伝えられます。これらの情報は,例えば掲示板CGIプログラムの書き込みなどで用いられます。

☆         ☆         ☆

 現在のWebアプリケーション開発では,PHP,ASP,JSPなどWebアプリケーション専用の開発環境を利用するか,なんらかのWebアプリケーション開発用フレームワークを利用するのが一般的でしょう。これらの技術は,サーバーとクライアントの通信をうまく隠ぺいしつつ,充実した開発ツールやライブラリを提供しています。おかげでプログラマは楽に,効率のよい開発ができます。

 とはいえ,紹介したようなCGIプログラムも,プログラマのたしなみとして,ぜひ経験してください。実験で見たように,CGIプログラムの本質は極めてシンプルです。標準入出力を備えたプログラミング言語が使えて,HTMLの書き方を知っている人なら,だれでもCGIプログラムを作ることができるでしょう。もし難解なバグに遭遇したときも,このような経験があれば,サーバーとクライアントのどちらに原因があるのかは容易に判別できるはずです。

矢沢 久雄(やざわ ひさお)
グレープシティ
アドバイザリースタッフ http://www.grapecity.com/