CGI是用于连接用于与服务器通信的外部程序的接口标准。尽管许多人更喜欢名称“脚本”或“ CGI程序”,但通常称为网关,根据此类接口与Web服务器一起工作的程序通常称为网关。实际上,它允许使用输入和输出控制台与客户端进行交互。
该界面本身的设计方式是可以使用任何可以与标准输入输出设备一起使用的编程语言。构建的脚本 - 操作系统的命令口译员具有这样的机会,因此在简单的情况下,甚至可以使用命令脚本。
CGI是创建动态站点的最常见手段之一。此标准由流行的Web服务器(例如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/etc/systemd/systemd/system/folder中,该文件未安装在其他系统上)。根据默认值,服务器将于127.0.0.1:1235启动。要设置设置,您需要更改配置文件:
service cgi start
service cgi stop
启动时,该程序会创建一个PID文件,并在该文件中记录当前过程的ID,以便将来您可以向其发送信号以完成工作。如果在服务器开始期间发生了错误,则不会创建文件。
#!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);
}
目前,它已实施:
即将推出: