CGI adalah standar antarmuka yang digunakan untuk menghubungkan program eksternal untuk komunikasi dengan server. Program yang berfungsi sesuai dengan antarmuka seperti itu bersama dengan server web umumnya disebut gateway, meskipun banyak yang lebih suka nama "skrip" atau "program CGI". Bahkan, ini memungkinkan penggunaan input dan konsol output untuk berinteraksi dengan klien.
Antarmuka itu sendiri dirancang sedemikian rupa sehingga setiap bahasa pemrograman dapat digunakan yang dapat bekerja dengan perangkat input-output standar. Script untuk penafsir komando yang dibangun dari sistem operasi memiliki peluang seperti itu, sehingga dalam kasus sederhana bahkan skrip perintah dapat digunakan.
CGI adalah salah satu cara paling umum untuk membuat situs dinamis. Standar ini digunakan oleh server web populer seperti misalnya, nginx atau apache.
Server tahu cara memperbaikinya pada host tertentu: port dan mendengarkan koneksi yang masuk. Pada alamat yang diberikan, halaman HTML dikeluarkan jika permintaan benar, atau halaman dengan kesalahan 404, jika halaman yang diminta tidak ada. Skrip CGI yang menunjukkan waktu ketika menekan tombol pada halaman utama juga diimplementasikan.
#!
htdocs/
cgi-bin/
install.c
utility.c
utility.h
main.c
Makefile
Kami menginstalnya menggunakan Make. Script Instalasi akan menyusun dan memindahkan file yang dapat dieksekusi ke folder/usr/lokal/bin, lalu buat file .service dan masukkan/etc/systemd/::
cd cgi/
make install
Server sekarang dapat diluncurkan dengan cara yang sama seperti layanan sistem (hanya berfungsi pada Ubuntu, karena menempatkan file unit di/etc/systemd/system/folder, yang tidak diinstal pada sistem lain). Menurut default, server akan mulai di 127.0.0.1:1235. Untuk mengatur pengaturan Anda, Anda perlu mengubah file konfigurasi:
service cgi start
service cgi stop
Saat memulai, program membuat file PID di mana ia mencatat ID dari proses saat ini sehingga di masa depan Anda dapat mengirim sinyal untuk menyelesaikan pekerjaan. Jika terjadi kesalahan selama awal server, file tidak dibuat.
#!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);
Selanjutnya, menggunakan satu set fungsi untuk bekerja dengan soket, kami mengatur server kami. Jika semuanya telah berlalu tanpa kesalahan, kami mulai menerima koneksi yang masuk. Untuk setiap koneksi yang diadopsi, kami membuat proses yang terpisah, proses orang tua terus mendengarkan.
#!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);
}
Anak perusahaan membaca permintaan tersebut, memprosesnya dan memberi halaman jawaban: Jika file ditemukan, maka halaman yang sesuai dikeluarkan, jika tidak pengguna akan menerima halaman dengan kesalahan 404. Semua statika disimpan dalam folder server HTDOCS.
#!c
read(client_socket, recv_buffer, sizeof(recv_buffer));
char *query_str = parse_request(recv_buffer);
...
GET(client_socket, query_str, maindir);
Saat mengklik pada halaman utama pada tombol "Dapatkan Waktu Saat Ini", skrip yang mengembalikan tanggal/waktu saat ini dilakukan:
#!c
if (strcmp(query_str + strlen(query_str) - 4, "cgi?") == 0) {
...
execve(main_dir, arg, empty2); //execute cgi-script
close(client_socket);
}
Saat ini, diimplementasikan:
Segera hadir: