CGI는 서버와의 통신을 위해 외부 프로그램을 연결하는 데 사용되는 인터페이스 표준입니다. 웹 서버와 함께 이러한 인터페이스에 따라 작동하는 프로그램은 일반적으로 게이트웨이라고하지만 많은 사람들이 "스크립트"또는 "CGI 프로그램"이라는 이름을 선호합니다. 실제로 입력 및 출력 콘솔을 사용하여 클라이언트와 상호 작용할 수 있습니다.
인터페이스 자체는 표준 입력 출력 장치와 함께 작동 할 수있는 모든 프로그래밍 언어를 사용할 수있는 방식으로 설계되었습니다. 운영 체제의 명령 통역사에 대한 스크립트에는 그러한 기회가 있으므로 간단한 경우 명령 스크립트조차 사용할 수 있습니다.
CGI는 동적 사이트를 만드는 가장 일반적인 수단 중 하나입니다. 이 표준은 예를 들어 Nginx 또는 Apache와 같은 인기있는 웹 서버에서 사용됩니다.
서버는 특정 호스트에서이를 수정하는 방법을 알고 있습니다. 포트와 들어오는 연결을 듣습니다. 주어진 주소에서 요청이 올바른 경우 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
서버는 이제 시스템 서비스와 동일한 방식으로 시작할 수 있습니다 (Ubuntu에서만 작동합니다. 다른 시스템에 설치되지 않은/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);
}
현재로서는 구현됩니다.
곧 출시 :