CGI ist der Schnittstellenstandard, der zum Verbinden eines externen Programms zur Kommunikation mit dem Server verwendet wird. Das Programm, das nach einer solchen Schnittstelle zusammen mit dem Webserver funktioniert, wird allgemein als Gateway bezeichnet, obwohl viele die Namen „Skript“ oder „CGI -Programm“ bevorzugen. Tatsächlich ermöglicht es die Verwendung der Eingangs- und Ausgangskonsole, mit dem Client zu interagieren.
Die Schnittstelle selbst ist so konzipiert, dass jede Programmiersprache verwendet werden kann, die mit Standard-Eingabe-Output-Geräten funktionieren kann. Skripte für gebaute Befehlsinterpreten von Betriebssystemen haben solche Möglichkeiten, sodass in einfachen Fällen sogar Befehlskripte verwendet werden können.
CGI ist eines der häufigsten Mittel, um dynamische Stellen zu erstellen. Dieser Standard wird von solchen beliebten Webservern verwendet, um beispielsweise Nginx oder Apache.
Der Server weiß, wie man es auf einem bestimmten Host behebt: den Port und hört eingehende Verbindungen an. Bei einer bestimmten Adresse wird eine HTML -Seite ausgestellt, wenn die Anforderung korrekt ist, oder eine Seite mit einem Fehler von 404, wenn die angeforderte Seite nicht vorhanden ist. Ein CGI -Skript, das Zeit beim Drücken der Schaltflächen auf der Hauptseite zeigt, wird ebenfalls implementiert.
#!
htdocs/
cgi-bin/
install.c
utility.c
utility.h
main.c
Makefile
Wir installieren es mit Make. Das Installationsskript erstellt und verschiebt die ausführbare Datei in den Ordner/usr/local/Bin, erstellt dann die .service -Datei und setzen Sie sie in/etc/systemd/:: ein.
cd cgi/
make install
Der Server kann nun genauso gestartet werden wie die Systemdienste (er funktioniert nur auf Ubuntu, da er eine Einheitsdatei in/etc/systemd/system/system/order platziert, die nicht auf anderen Systemen installiert ist). Nach der Standardeinstellung startet der Server bei 127.0.0.1:1235. Um Ihre Einstellungen festzulegen, müssen Sie die Konfigurationsdatei ändern:
service cgi start
service cgi stop
Beim Starten erstellt das Programm eine PID -Datei, in die die ID des aktuellen Prozesses aufgezeichnet wird, damit Sie in Zukunft ein Signal an sie senden können, um die Arbeiten abzuschließen. Wenn während des Serverstarts ein Fehler aufgetreten ist, wird die Datei nicht erstellt.
#!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);
Als nächstes haben wir unseren Server eingerichtet. Wenn alles ohne Fehler vergangen ist, akzeptieren wir eingehende Verbindungen. Für jede angenommene Verbindung erstellen wir einen separaten Prozess, der elterliche Prozess hört weiter zu.
#!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);
}
Die Tochtergesellschaft liest die Anfrage, verarbeitet sie und gibt der Seite die Antwort an: Wenn die Datei gefunden wurde, wird die entsprechende Seite ausgestellt. Andernfalls erhält der Benutzer eine Seite mit einem Fehler von 404. Alle Statik werden im HTDOCS -Serverordner gespeichert.
#!c
read(client_socket, recv_buffer, sizeof(recv_buffer));
char *query_str = parse_request(recv_buffer);
...
GET(client_socket, query_str, maindir);
Wenn Sie auf die Hauptseite auf der Schaltfläche "Aktuelle Zeit abrufen" klicken, wird ein Skript, das das aktuelle Datum/die aktuelle Uhrzeit zurückgibt, ausgeführt:
#!c
if (strcmp(query_str + strlen(query_str) - 4, "cgi?") == 0) {
...
execve(main_dir, arg, empty2); //execute cgi-script
close(client_socket);
}
Im Moment wird es implementiert:
Bald kommen: