CGI es el estándar de interfaz utilizado para conectar un programa externo para la comunicación con el servidor. El programa que funciona según una interfaz de este tipo junto con el servidor web se llama comúnmente una puerta de enlace, aunque muchos prefieren los nombres "Script" o "Programa CGI". De hecho, permite que el uso de la consola de entrada y salida interactúe con el cliente.
La interfaz en sí está diseñada de tal manera que se pueda utilizar cualquier lenguaje de programación que pueda funcionar con dispositivos de entrada-salida estándar. Los scripts para los intérpretes de comandos Built -In de los sistemas operativos tienen tales oportunidades, por lo que en casos simples, incluso se pueden utilizar scripts de comando.
CGI es uno de los medios más comunes para crear sitios dinámicos. Este estándar es utilizado por servidores web populares como, por ejemplo, Nginx o Apache.
El servidor sabe cómo solucionarlo en un host específico: el puerto y escuchar conexiones entrantes. En una dirección dada, se emite una página HTML si la solicitud es correcta, o una página con un error de 404, si la página solicitada no existe. También se implementa un script CGI que muestra el tiempo al presionar los botones en la página principal.
#!
htdocs/
cgi-bin/
install.c
utility.c
utility.h
main.c
Makefile
Lo instalamos usando Make. El script de instalación compilará y moverá el archivo ejecutable a la carpeta/usr/local/bin, luego creará el archivo .service y lo ponga en/etc/systemd/::
cd cgi/
make install
El servidor ahora se puede iniciar de la misma manera que los servicios del sistema (solo funciona en Ubuntu, porque coloca un archivo unitario en la carpeta/etc/systemd/sistema/, que no está instalado en otros sistemas). Según el valor predeterminado, el servidor comenzará a 127.0.0.1:1235. Para configurar su configuración, debe cambiar el archivo de configuración:
service cgi start
service cgi stop
Al comenzar, el programa crea un archivo PID en el que registra la ID del proceso actual para que en el futuro pueda enviarle una señal para completar el trabajo. Si se ha producido un error durante el inicio del servidor, no se crea el archivo.
#!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);
A continuación, utilizando un conjunto de funciones para trabajar con sockets, configuramos nuestro servidor. Si todo ha pasado sin errores, comenzamos a aceptar conexiones entrantes. Para cada conexión adoptada, creamos un proceso separado, el proceso de los padres continúa escuchando.
#!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);
}
La subsidiaria lee la solicitud, la procesa y le da a la página la respuesta: si se encontró el archivo, entonces se emite la página correspondiente; de lo contrario, el usuario recibirá una página con un error de 404. Todas las estadísticas se almacenan en la carpeta HTDOCS Server.
#!c
read(client_socket, recv_buffer, sizeof(recv_buffer));
char *query_str = parse_request(recv_buffer);
...
GET(client_socket, query_str, maindir);
Al hacer clic en la página principal en el botón "Obtener hora actual", se realiza un script que devuelve la fecha/hora actual:
#!c
if (strcmp(query_str + strlen(query_str) - 4, "cgi?") == 0) {
...
execve(main_dir, arg, empty2); //execute cgi-script
close(client_socket);
}
Por el momento, se implementa:
Muy pronto: