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/system/โฟลเดอร์ซึ่งไม่ได้ติดตั้งในระบบอื่น ๆ ) ตามค่าเริ่มต้นเซิร์ฟเวอร์จะเริ่มต้นที่ 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);
}
ในขณะนี้มันถูกนำไปใช้:
เร็วๆ นี้: