CGIは、サーバーとの通信のために外部プログラムを接続するために使用されるインターフェイス標準です。このようなインターフェイスに従ってWebサーバーに従って機能するプログラムは、一般にゲートウェイと呼ばれますが、多くの場合は「スクリプト」または「CGIプログラム」という名前を好みます。実際、入力コンソールと出力コンソールを使用してクライアントと対話することができます。
インターフェイス自体は、標準の入出力デバイスで動作できるプログラミング言語を使用できるように設計されています。構築された - オペレーティングシステムのコマンド通訳者のスクリプトにはそのような機会があるため、単純な場合はコマンドスクリプトを使用できます。
CGIは、動的サイトを作成する最も一般的な手段の1つです。この標準は、たとえばNginxやApacheなどの人気のあるWebサーバーで使用されています。
サーバーは、特定のホストでそれを修正する方法を知っています:ポートと着信接続を聞く。特定のアドレスで、リクエストが正しい場合はHTMLページが発行されます。また、要求されたページが存在しない場合は、404のエラーがあるページが発行されます。メインページのボタンを押すときの時間を示すCGIスクリプトも実装されています。
#!
htdocs/
cgi-bin/
install.c
utility.c
utility.h
main.c
Makefile
Makeを使用してインストールします。インストールスクリプトは、実行可能ファイルを/usr/local/binフォルダーにコンパイルして移動し、.serviceファイルを作成して/etc/systemd/::に配置します
cd cgi/
make install
サーバーは、システムサービスと同じ方法で起動できるようになりました(他のシステムにはインストールされていない/etc/systemd/system/フォルダーにユニットファイルを配置するため)。デフォルトに応じて、サーバーは127.0.0.1:1235から開始されます。設定を設定するには、構成ファイルを変更する必要があります。
service cgi start
service cgi stop
開始時に、プログラムは現在のプロセスのIDを記録するPIDファイルを作成し、将来、作業を完了するために信号を送信できるようにします。サーバーの開始時にエラーが発生した場合、ファイルは作成されません。
#!c
//creating PID file
FILE * file = fopen(path_to_pidfile, "a+");
fprintf(file, "%d", getpid());
fclose(file);
//killing running server
FILE * file = fopen(path_to_pidfile, "r+");
fscanf(file, "%d", &pid);
kill(pid, SIGTERM);
fclose(file);
remove(path_to_pidfile);
次に、ソケットを使用するための一連の関数を使用して、サーバーをセットアップします。すべてがエラーなしで合格した場合、着信接続を受け入れ始めます。採用されている各接続ごとに、別のプロセスを作成し、親のプロセスは聴き続けます。
#!c
pid_t pid = fork();
if (0 == pid) { //if it is child process - interact connection
handle_request(client_socket, &client_address, htdocs);
exit(0);
} else { //otherwise close socket and continue listening
close(client_socket);
}
子会社はリクエストを読み取り、それを処理し、ページに回答を与えます:ファイルが見つかった場合、対応するページが発行されます。そうしないと、ユーザーは404のエラーのあるページを受信します。すべての静的はHTDOCSサーバーフォルダーに保存されます。
#!c
read(client_socket, recv_buffer, sizeof(recv_buffer));
char *query_str = parse_request(recv_buffer);
...
GET(client_socket, query_str, maindir);
「現在の時間を取得」ボタンでメインページをクリックすると、現在の日付/時間を返すスクリプトが実行されます。
#!c
if (strcmp(query_str + strlen(query_str) - 4, "cgi?") == 0) {
...
execve(main_dir, arg, empty2); //execute cgi-script
close(client_socket);
}
現時点では、実装されています。
近日公開: