変化するページを作るCGIの最初の例として、 現在時刻を表示するページを作るCGIを作ってみましょう。
CGIのソースファイル名は showtime.cc としましょう。 以下にそのリストを載せます。
// showtime.cc #include<stdio.h> #include<time.h> int main( void ) { puts( "Content-type: text/html\n" "\n" "<HTML>\n" "<HEAD>\n" "<TITLE> Show the current time </TITLE>\n" "</HEAD>\n" "<BODY>\n" "<H2>" ); time_t t = time(NULL); printf( "<P>The current time is listed below.<BR>\n" "%s.</P>", ctime(&t) ); puts( "</H2>\n" "<HR>\n" "</BODY>\n" "</HTML>" ); return 0; }
時刻を取り扱う所以外はputs関数とprintf関数で文字列を出力しているだけです。
とりあえず、このソースを普通にコンパイルして、 普通に(コマンドラインで)実行してみて下さい。 以下のような出力が得られます。
Content-type: text/html <HTML> <HEAD> <TITLE>Show the current time</TITLE> </HEAD> <BODY> <H2> <P>The current time is listed below.<BR> Sat Oct 21 19:25:32 1995.</P> </H2><HR> </BODY> </HTML>
何の変哲もないHTML文章ですが、最初の二行だけにHTMLとは異なる 重要な意味があります。一行目の Content-type: text/html の行は 以下の文章の内容の種類がHTMLのテキストであることを web server に 知らせる働きがあります。そして二行目の空行はこの後にその内容が 始まることを web server に伝える働きがあります。 このようにCGIプログラムでは最初の出力が web server との事前交渉に 使われます。その規格がCGIなわけです。
このプログラムをCGIとして web server上で動かすには
通常とは異なるコンパイル方法や特別なファイル拡張子や
特別なファイル置場が必要となるかもしれません。
それらは web server の OS や管理者の管理方針によって異なります。
UNIXでは実行ファイルの拡張子を .cgi として web でアクセス可能な
ディレクトリに置くと web server がCGIとして実行することができるようになります。
もしくは、cgi-bin ディレクトリの下に実行ファイルを置くことです。
Windowsでは、実行ファイルの拡張子は .COM か .EXE と決まっているので、
cgi-bin ディレクトリにCGI実行ファイルを置くしかありません。
詳細はおなじ web server でCGIを動かしている友人にでも尋ねて下さい。
CGIの permission が他人にも実行できるようになっているかを確認して、 そしてそのCGIに次のようにリンクを張ってください。 これで誰かがこのリンクを辿ってこのCGIにアクセスすると web serverがこのCGIを実行するのです。そしてCGIの標準出力から出てきた HTML文章を browser が処理するのです。
<A HREF="showtime.cgi">今の時刻は?</A> 今の時刻は?
CGIの実行時にコマンドライン引数を与えることも出来ます。 CGIファイル名の後ろに?マークを付けて引き数を+で区切って並べます。 例えば以下のようにです。
<A HREF="showtime.cgi?Tokyo+London+NewYork">今の時刻は?</A>
以下のような main関数の引数に対して 次のように値が与えれます。
int main( int argc, char* argv[] )
argv[0] = "showtime.cgi", argv[1] = "Tokyo", argv[2] = "London", argv[3] = "NewYork"ただし管理者のHTTPdの設定により argv[1] に別な情報が入り、 後ろの引数のインデックスが一つずれることがあります。 ご確認ください。もしずれていているとプログラムがややこしくなるので main関数冒頭で
とすることで調整できます。argc--; argv++;
CGIのコンパイルでは拡張子が permission やその他いろいろな ことに気を付けなければならないので、それらを考慮したコンパイル用の スクリプトを作っておくと便利でしょう。私の web server では特に 規制がないので単に次のような C shell script (名前はcgi)で コンパイルしています。
#!/bin/csh -f # cgi # C shell script for compiling a cgi program. gcc -O2 $argv[1] -o $argv[1]:r.cgi chmod g=.o=x $argv[1]:r.cgi
これを用意しておけば、
とするだけでCGIができあがります。cgi showtime.cc