簡単なCGIの例:現在時刻を表示するページを作る

変化するページを作るCGIの最初の例として、 現在時刻を表示するページを作る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なわけです。


● 本番コンパイルとweb上での実行

このプログラムを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の実行時にコマンドライン引数を与えることも出来ます。 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コンパイル用スクリプト

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 showtime.cc
とするだけでCGIができあがります。


目次

Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp