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);
}
目前,它已實施:
即將推出: