O CGI é o padrão de interface usado para conectar um programa externo para comunicação com o servidor. O programa que funciona de acordo com essa interface juntamente com o servidor da Web é comumente chamado de gateway, embora muitos prefiram os nomes "script" ou "programa CGI". De fato, permite que o uso do console de entrada e saída interaja com o cliente.
A própria interface é projetada de forma que qualquer linguagem de programação possa ser usada que possa funcionar com dispositivos de entrada de entrada padrão. Os scripts para intérpretes de comando construídos de sistemas operacionais têm essas oportunidades; portanto, em casos simples, até scripts de comando podem ser usados.
O CGI é um dos meios mais comuns de criar sites dinâmicos. Este padrão é usado por servidores web populares como, por exemplo, nginx ou apache.
O servidor sabe como corrigi -lo em um host específico: a porta e ouça as conexões recebidas. Em um determinado endereço, uma página HTML será emitida se a solicitação estiver correta ou uma página com um erro de 404, se a página solicitada não existir. Um script CGI mostrando o tempo ao pressionar os botões na página principal também é implementado.
#!
htdocs/
cgi-bin/
install.c
utility.c
utility.h
main.c
Makefile
Nós o instalamos usando make. O script de instalação compilará e moverá o arquivo executável para a pasta/usr/local/bin, depois criará o arquivo .service e coloque -o em/etc/systemd/::
cd cgi/
make install
O servidor agora pode ser iniciado da mesma maneira que os serviços do sistema (ele funciona apenas no Ubuntu, porque coloca um arquivo de unidade na pasta/etc/systemd/system/, que não está instalada em outros sistemas). De acordo com o padrão, o servidor começará em 127.0.0.1:1235. Para definir suas configurações, você precisa alterar o arquivo de configuração:
service cgi start
service cgi stop
Ao iniciar, o programa cria um arquivo PID no qual registra o ID do processo atual para que, no futuro, você possa enviar um sinal para concluir o trabalho. Se ocorreu um erro durante o início do servidor, o arquivo não será criado.
#!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);
Em seguida, usando um conjunto de funções para trabalhar com soquetes, configuramos nosso servidor. Se tudo passou sem erros, começamos a aceitar conexões de entrada. Para cada conexão adotada, criamos um processo separado, o processo dos pais continua ouvindo.
#!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);
}
A subsidiária lê a solicitação, o processa e fornece à página a resposta: se o arquivo foi encontrado, a página correspondente será emitida; caso contrário, o usuário receberá uma página com um erro de 404. Todas as estáticas são armazenadas na pasta Htdocs Server.
#!c
read(client_socket, recv_buffer, sizeof(recv_buffer));
char *query_str = parse_request(recv_buffer);
...
GET(client_socket, query_str, maindir);
Ao clicar na página principal no botão "Obter horário atual", um script que retorna a data/hora atual é executado:
#!c
if (strcmp(query_str + strlen(query_str) - 4, "cgi?") == 0) {
...
execve(main_dir, arg, empty2); //execute cgi-script
close(client_socket);
}
No momento, é implementado:
Em breve: