Cap. 12. Programare

Cuprins

12.1. Scriptul Shell
12.1.1. Compatibilitate cu shell-ul POSIX
12.1.2. Parametri shell
12.1.3. Condiționale shell
12.1.4. Bucle shell
12.1.5. Variabilele de mediu ale shell
12.1.6. Secvența de procesare a liniei de comandă shell
12.1.7. Programe utile pentru scripturile shell
12.2. Programarea în limbaje interpretate
12.2.1. Depanarea codurilor în limbaje interpretate
12.2.2. Program cu interfață grafică (GUI) și script de shell
12.2.3. Acțiuni personalizate pentru gestionarul de fișiere cu interfață grafică
12.2.4. Nebunia scripturilor scurte în Perl
12.3. Programarea în limbaje compilate
12.3.1. C
12.3.2. Program simplu în limbajul C (gcc)
12.3.3. Flex — o versiune îmbunătățită a Lex
12.3.4. Bison — o versiune îmbunătățită a Yacc
12.4. Instrumente de analiză statică a codului
12.5. Depanare
12.5.1. Executarea de bază a gdb
12.5.2. Depanarea pachetului Debian
12.5.3. Obținerea urmăririi traseului execuției
12.5.4. Comenzi avansate gdb
12.5.5. Verificați dependențele de biblioteci
12.5.6. Instrumente de urmărire dinamică a apelurilor
12.5.7. Depanarea erorilor X
12.5.8. Instrumente de detectare a „scurgerilor” de memorie
12.5.9. Dezasamblarea unui fișier binar
12.6. Instrumentele de construcție
12.6.1. Make
12.6.2. Autotools
12.6.2.1. Compilarea și instalarea unui program
12.6.2.2. Dezinstalarea unui program
12.6.3. Meson
12.7. Web
12.8. Conversia codului sursă
12.9. Crearea pachetului Debian

Vă ofer câteva sfaturi pentru cei care doresc să învețe programarea pe sistemul Debian la un nivel suficient pentru a putea urmări codul sursă al pachetelor. Iată câteva pachete importante și documentația aferentă pentru programare.

Referințele sunt disponibile introducând „man nume” după instalarea pachetelor manpages și manpages-dev. Referințele pentru instrumentele GNU sunt disponibile prin tastarea „info nume_program” după instalarea pachetelor de documentație relevante. Este posibil să fie necesar să includeți arhivele contrib și non-free în plus față de arhiva main, deoarece unele documentații GFDL nu sunt considerate conforme cu DFSG.

Vă recomandăm să utilizați instrumentele sistemului de control al versiunilor. Consultați Secțiune 10.5, „Git”.

[Avertisment] Avertisment

Nu folosiți „test” ca nume pentru un fișier executabil de testare. „test” este o comandă internă a shell-ului.

[Atenție] Atenție

Ar trebui să instalați programele software compilate direct din sursă în „/usr/local” sau „/opt” pentru a evita suprapunerea cu programele din sistem.

[Indicație] Indicație

Exemplele de cod pentru crearea melodiei „99 Bottles of Beer” ar trebui să vă ofere idei utile pentru aproape toate limbajele de programare.

Scriptul shell este un fișier text cu dreptul de execuție activat și conține comenzi în următorul format.

#!/bin/sh
 ... command lines

Prima linie specifică interpretul shell care citește și execută conținutul acestui fișier.

Citirea scripturilor shell este cea mai bună modalitate de a înțelege cum funcționează un sistem de tip Unix. Aici vă ofer câteva indicații și sfaturi utile pentru programarea în shell. Consultați „Greșeli în shell” (https://www.greenend.org.uk/rjk/2001/04/shell.html) pentru a învăța din greșeli.

Spre deosebire de modul interactiv al shell-ului (a se vedea Secțiune 1.5, „Comanda simplă de shell” și Secțiune 1.6, „Procesarea textului în stilul Unix”), scripturile shell utilizează frecvent parametri, condiții și bucle.

Multe scripturi de sistem pot fi interpretate de oricare dintre shell-urile POSIX (vedeți Tabel 1.13, „Lista programelor shell”).

  • Shell-ul POSIX implicit, neinteractiv, „/usr/bin/sh”, este o legătură simbolică care indică spre /usr/bin/dash și este utilizat de multe programe din sistem.

  • Shell-ul POSIX interactiv implicit este /usr/bin/bash.

Evitați să scrieți un script de shell care conține „bashisme” (particularități ale shell-ului bash) sau „zshisme>” (particularități ale shell-ului zsh), pentru a-l face compatibil cu toate shell-urile POSIX. Puteți verifica acest lucru folosind checkbashisms(1).


Comanda „echo” trebuie utilizată cu următoarele precauții, deoarece implementarea sa diferă între comenzile interne ale shell-ului și cele externe.

  • Evitați utilizarea oricăror opțiuni ale comenzii «echo» cu excepția „-n”.

  • Evitați utilizarea secvențelor de eludare în șir, deoarece gestionarea acestora variază.

[Notă] Notă

Deși opțiunea „-nnu este, de fapt, o sintaxă POSIX, ea este acceptată în general.

[Indicație] Indicație

Folosiți comanda „printf” în locul comenzii „echo” dacă trebuie să includeți secvențe de eludare în șirul de ieșire.

Fiecare comandă returnează un cod de ieșire care poate fi utilizat în expresii condiționale.

  • Succes: 0 („True” - adevărat)

  • Eroare: diferit de 0 („False” - fals)

[Notă] Notă

În contextul condițional al shell-ului, „0” înseamnă „Adevărat”, în timp ce în contextul condițional al limbajului C, „0” înseamnă „Fals”.

[Notă] Notă

[” este echivalentul comenzii test, care evaluează argumentele sale până la „]” ca o expresie condițională.

Expresiile condiționale de bază pe care trebuie să le rețineți sunt următoarele.

  • comandă && dacă_succes_execută_și_această_comandă || true

  • comandă || dacă_nu_a_reușit_execută_și_această_comandă || true

  • Un fragment de cod cu mai multe linii, ca în exemplul următor

if [ conditional_expression ]; then
 if_success_run_this_command
else
 if_not_success_run_this_command
fi

Aici a fost necesară adăugarea secvenței „|| true” pentru a se asigura că acest script de shell nu se închide accidental la această linie atunci când shell-ul este invocat cu opțiunea „-e”.



Operatorii aritmetici de comparare a numerelor întregi din expresia condițională sunt „-eq”, „-ne”, „ -lt„, ”-le„, ”-gt„ și ”-ge".

Shell-ul procesează un script aproximativ după următoarea secvență.

  • Shell-ul citește o linie.

  • Shell-ul grupează o parte a liniei ca un singur element (token) dacă aceasta se află între "…" sau '…'.

  • Shell-ul împarte restul unei linii în elemente (token-uri) după cum urmează.

    • Spații-albe: spațiu tabulator linie-nouă

    • Metacaractere::< > | ; & ( )

  • Shell-ul verifică cuvântul rezervat pentru fiecare token, pentru a-și adapta comportamentul în cazul în care acesta nu se află între "…" sau '…'.

    • cuvânt rezervat: if then elif else fi for in while unless do done case esac

  • Shell-ul extinde alias dacă acesta nu se află între "…" sau '…'.

  • Shell-ul expandează tilde dacă nu se află între "…" sau '…'.

    • ~” → directorul personal al utilizatorului curent

    • ~utilizator” → directorul personal al utilizatorului

  • Shell-ul înlocuiește parametrul cu valoarea acestuia, dacă nu se află între '…'.

    • parametru: „$PARAMETER” sau „${PARAMETER}

  • Shell-ul extinde substituirea comenzii dacă aceasta nu se află între '…'.

    • $( comandă )” → ieșirea comenzii „comandă

    • ` comandă `” → rezultatul comenzii „comandă

  • Shell-ul extinde expresia de tip glob (cu caractere joker) pentru ruta la numele de fișiere corespunzătoare, dacă acestea nu se află între "…" sau '…'.

    • * → orice caractere

    • ? → un caracter

    • […] → oricare dintre caracterele din ""

  • Shell-ul caută comanda din următoarele și o execută.

    • definiția funcției

    • comanda internă

    • fișierul executabil din „$PATH

  • Shell-ul trece la linia următoare și repetă acest proces de la începutul secvenței.

Ghilimelele simple între ghilimele duble nu au niciun efect.

Executarea comenzii „set -x” în shell sau lansarea shell-ului cu opțiunea „-x” determină shell-ul să afișeze toate comenzile executate. Acest lucru este foarte util pentru depanare.


Când doriți să automatizați o sarcină în Debian, ar trebui să o programați mai întâi într-un limbaj interpretat. Ghidul pentru alegerea limbajului interpretat este:

  • Folosiți dash dacă sarcina este una simplă, care combină programe CLI cu un program shell.

  • Folosiți python3 dacă sarcina nu este una simplă și o scrieți de la zero.

  • Folosiți perl, tcl, ruby, ... dacă există un cod existent în Debian care utilizează unul dintre aceste limbaje și care trebuie modificat pentru a îndeplini sarcina.

Dacă codul rezultat este prea lent, puteți rescrie doar porțiunea esențială pentru viteza de execuție într-un limbaj compilat și o puteți apela din limbajul interpretat.

Scriptul Shell poate fi îmbunătățit pentru a crea un program cu interfață grafică atractivă. Secretul constă în utilizarea unuia dintre așa-numitele programe de tip dialog, în locul interacțiunii monotone bazate pe comenzile echo și read.


Iată un exemplu de program cu interfață grafică care demonstrează cât de ușor este să realizezi acest lucru folosind doar un script de shell.

Acest script utilizează zenity pentru a selecta un fișier (implicit /etc/motd) și a-l afișa.

Lansatorul GUI pentru acest script poate fi creat urmând instrucțiunile de la Secțiune 9.4.10, „Pornirea unui program din interfața grafică”.

#!/bin/sh -e
# Copyright (C) 2021 Osamu Aoki <osamu@debian.org>, Public Domain
# vim:set sw=2 sts=2 et:
DATA_FILE=$(zenity --file-selection --filename="/etc/motd" --title="Select a file to check") || \
  ( echo "E: File selection error" >&2 ; exit 1 )
# Check size of archive
if ( file -ib "$DATA_FILE" | grep -qe '^text/' ) ; then
  zenity --info --title="Check file: $DATA_FILE" --width 640  --height 400 \
    --text="$(head -n 20 "$DATA_FILE")"
else
  zenity --info --title="Check file: $DATA_FILE" --width 640  --height 400 \
    --text="The data is MIME=$(file -ib "$DATA_FILE")"
fi

Acest tip de abordare a programelor cu interfață grafică (GUI) folosind scripturi shell este utilă doar în cazurile simple. Dacă intenționați să scrieți un program mai complex, vă recomandăm să îl scrieți pe o platformă mai performantă.


Aici, Secțiune 12.3.3, „Flex — o versiune îmbunătățită a Lex” și Secțiune 12.3.4, „Bison — o versiune îmbunătățită a Yacc” sunt incluse pentru a arăta cum se pot scrie programe de tip compilator în limbajul C, prin compilarea unei descrieri de nivel superior în limbajul C.

Puteți configura mediul necesar pentru a compila programe scrise în limbajul de programare C urmând pașii de mai jos.

# apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential

Pachetul libc6-dev, adică biblioteca GNU C, oferă biblioteca standard C, care este o colecție de fișiere antet și rutine de bibliotecă utilizate de limbajul de programare C.

A se vedea următoarele referințe pentru limbajul C.

  • info libc” (referința funcțiilor bibliotecii C)

  • gcc(1) și «info gcc»

  • each_C_library_function_name(3)

  • Kernighan & Ritchie, „The C Programming Language” - Limbajul de programare C, ediția a II-a (Prentice Hall)

Flex este un generator de analizare lexicală rapidă, compatibil cu Lex.

Tutorialul pentru flex(1) poate fi găsit în «info flex».

Multe exemple simple pot fi găsite în „/usr/share/doc/flex/examples/”. [7]

În Debian, există mai multe pachete care oferă un generator de analizare LR cu citire anticipată compatibil cu Yacc sau un generator de analizare LALR.


Tutorialul pentru bison(1) poate fi găsit în «info bison».

Trebuie să furnizați propriile funcții „main()” și „yyerror()”. Funcția „main()” apelează funcția „yyparse()”, care la rândul ei apelează funcția „yylex()”, create de obicei cu ajutorul Flex.

Iată un exemplu de creare a unui program simplu de calculator pentru terminal.

Să creăm example.y:

/* calculator source for bison */
%{
#include <stdio.h>
extern int yylex(void);
extern int yyerror(char *);
%}

/* declare tokens */
%token NUMBER
%token OP_ADD OP_SUB OP_MUL OP_RGT OP_LFT OP_EQU

%%
calc:
 | calc exp OP_EQU    { printf("Y: RESULT = %d\n", $2); }
 ;

exp: factor
 | exp OP_ADD factor  { $$ = $1 + $3; }
 | exp OP_SUB factor  { $$ = $1 - $3; }
 ;

factor: term
 | factor OP_MUL term { $$ = $1 * $3; }
 ;

term: NUMBER
 | OP_LFT exp OP_RGT  { $$ = $2; }
  ;
%%

int main(int argc, char **argv)
{
  yyparse();
}

int yyerror(char *s)
{
  fprintf(stderr, "error: '%s'\n", s);
}

Să creăm example.l:

/* calculator source for flex */
%{
#include "example.tab.h"
%}

%%
[0-9]+ { printf("L: NUMBER = %s\n", yytext); yylval = atoi(yytext); return NUMBER; }
"+"    { printf("L: OP_ADD\n"); return OP_ADD; }
"-"    { printf("L: OP_SUB\n"); return OP_SUB; }
"*"    { printf("L: OP_MUL\n"); return OP_MUL; }
"("    { printf("L: OP_LFT\n"); return OP_LFT; }
")"    { printf("L: OP_RGT\n"); return OP_RGT; }
"="    { printf("L: OP_EQU\n"); return OP_EQU; }
"exit" { printf("L: exit\n");   return YYEOF; } /* YYEOF = 0 */
.      { /* ignore all other */ }
%%

Apoi, pentru a încerca acest lucru, executați următoarea comandă din linia de comandă:

$ bison -d example.y
$ flex example.l
$ gcc -lfl example.tab.c lex.yy.c -o example
$ ./example
1 + 2 * ( 3 + 1 ) =
L: NUMBER = 1
L: OP_ADD
L: NUMBER = 2
L: OP_MUL
L: OP_LFT
L: NUMBER = 3
L: OP_ADD
L: NUMBER = 1
L: OP_RGT
L: OP_EQU
Y: RESULT = 9

exit
L: exit

Instrumentele de tip Lint pot facilita efectuarea automată a analizei statice a codului.

Instrumentele de tip Indent pot facilita revizuirea manuală a codului prin reformatarea consecventă a codurilor sursă.

Instrumentele precum Ctags pot ajuta la revizuirea manuală a codului prin generarea unui fișier index (sau de etichete) cu numele identificate în codurile sursă.

[Indicație] Indicație

Configurarea editorului preferat (emacs sau vim) pentru a utiliza module de motoare de verificare sintactică (lint) asincrone vă ajută la scrierea codului. Aceste module devin din ce în ce mai performante, profitând de Language Server Protocol. Având în vedere că evoluează rapid, utilizarea codului lor din sursa originală, în locul pachetului Debian, poate fi o opțiune bună.

Tabel 12.12. Lista instrumentelor pentru analiza statică a codului

pachet popcon(popularitate) dimensiune descriere
vim-ale I:0.82 2833 motor lint asincron pentru Vim 8 și NeoVim
vim-syntastic I:2.3 1379 trucuri pentru verificarea sintaxei în Vim
elpa-flycheck V:0.1, I:1.6 815 verificare sintactică din mers pentru Emacs
elpa-relint I:0.05 150 instrument de detectare a erorilor în expresiile regulate Emacs Lisp
cppcheck-gui V:0.1, I:1.1 7682 instrument pentru analiza statică a codului C/C++ (interfață grafică)
shellcheck V:3, I:16 22859 instrument de analizare sintatică a scripturilor shell
pyflakes3 V:2, I:15 20 verificator pasiv al programelor Python 3
pylint V:4, I:20 2089 verificator static al codului Python
perl V:673, I:991 841 interpret cu verificator intern de cod static: B::Lint(3perl)
rubocop V:0.11, I:0.96 3981 analizator de cod static Ruby
clang-tidy V:2, I:12 22 instrument de analizare sintactică a codului C++ bazat pe clang
splint V:0.1, I:1.0 2328 instrument pentru verificarea statică a programelor C în vederea depistării erorilor
flawfinder V:0.07, I:0.52 205 instrument pentru examinarea codului sursă C/C++ și identificarea vulnerabilităților de securitate
black V:4, I:16 9975 instrument de formatare a codului Python fără compromisuri
perltidy V:0.5, I:3.2 3086 instrument de indentare și reformatare a scripturilor Perl
indent V:0.4, I:5.3 438 program de formatare a codului sursă în limbajul C
astyle V:0.2, I:2.6 769 instrument de indentare a codului sursă pentru limbajele C, C++, Objective-C, C# și Java
bcpp V:0.02, I:0.29 114 instrument de formatare elegantă pentru C(++)
xmlindent V:0.08, I:0.85 52 instrument de reformatare a fluxului XML
global V:0.2, I:1.7 1923 instrumente de căutare și navigare în codul sursă
exuberant-ctags V:2, I:14 341 creează indexuri ale fișierelor de etichete pentru definițiile codului sursă
universal-ctags V:1, I:12 4238 creează indexuri ale fișierelor de etichete pentru definițiile codului sursă

Depanarea este o parte importantă a activităților de programare. Dacă știi să depanezi programele, devii un utilizator Debian competent, capabil să întocmească rapoarte de erori relevante.


Principalul depanator din Debian este gdb(1), care vă permite să examinați un program în timpul execuției.

Să instalăm gdb și programele asociate urmând pașii de mai jos.

# apt-get install gdb gdb-doc build-essential devscripts

Un bun tutorial despre gdb este disponibil:

  • «info gdb»

  • „Depanarea cu GDB” în /usr/share/doc/gdb-doc/html/gdb/index.html

  • tutorial în Internet

Iată un exemplu simplu de utilizare a gdb(1) pe un „program” compilat cu opțiunea „-g” pentru a genera informații de depanare.

$ gdb program
(gdb) b 1                # set break point at line 1
(gdb) run args           # run program with args
(gdb) next               # next line
...
(gdb) step               # step forward
...
(gdb) p parm             # print parm
...
(gdb) p parm=12          # set value to 12
...
(gdb) quit
[Indicație] Indicație

Multe comenzi gdb(1) pot fi abreviate. Extinderea cu tasta «Tab» funcționează la fel ca în shell.

Deoarece toate fișierele binare instalate trebuie să fie curățate de simboluri în sistemul Debian în mod implicit, majoritatea simbolurilor de depanare sunt eliminate din pachetul standard. Pentru a depana pachetele Debian cu gdb(1), trebuie instalate pachetele *-dbgsym (de exemplu, coreutils-dbgsym în cazul coreutils). Pachetele sursă generează automat pachete *-dbgsym împreună cu pachetele binare normale, iar aceste pachete de depanare sunt plasate separat în arhiva debian-debug. Vă rugăm să consultați articolele de pe Debian Wiki pentru mai multe informații.

Dacă un pachet care urmează să fie depanat nu include pachetul *-dbgsym, trebuie să îl instalați după ce îl recompilați, urmând pașii de mai jos.

$ mkdir /path/new ; cd /path/new
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install fakeroot devscripts build-essential
$ apt-get source package_name
$ cd package_name*
$ sudo apt-get build-dep ./

Remediați erorile, dacă este necesar.

Actualizați versiunea pachetului la una care nu intră în conflict cu versiunile oficiale Debian, de exemplu una la care se adaugă „+debug1” atunci când recompilați o versiune existentă a pachetului, sau una la care se adaugă „~pre1” atunci când compilați o versiune a pachetului care nu a fost încă lansată, urmând pașii de mai jos.

$ dch -i

Compilați și instalați pachetele cu simboluri de depanare urmând pașii de mai jos.

$ export DEB_BUILD_OPTIONS="nostrip noopt"
$ debuild
$ cd ..
$ sudo debi package_name*.changes

Trebuie să verificați scripturile de compilare ale pachetului și să vă asigurați că utilizați „CFLAGS=-g -Wall” pentru compilarea fișierelor binare.

Când programul se „prăbușește” (crash), este recomandat să trimiteți un raport de eroare care să conțină informațiile traseului de execuție copiate și lipite.

Urmărirea traseului de execuție poate fi obținută prin gdb(1) folosind una dintre următoarele metode:

În cazul unei bucle infinite sau al blocării tastaturii, puteți forța închiderea programului apăsând Ctrl-\ sau Ctrl-C sau executând comanda „kill -ABRT PID”. (Consultați Secțiune 9.4.12, „Omorârea unui proces”)

[Indicație] Indicație

Adesea, se întâmplă să vezi o urmă de execuție în care una sau mai multe dintre primele linii sunt de tipul „malloc()” sau „g_malloc()”. Când se întâmplă acest lucru, este foarte probabil ca traseul de execuție să nu fie foarte util. Cea mai simplă modalitate de a găsi informații utile este să configurați variabila de mediu „$MALLOC_CHECK_” la valoarea 2 (malloc(3)). Puteți face acest lucru în timp ce rulați gdb, urmând pașii de mai jos.

 $ MALLOC_CHECK_=2 gdb hello

Make este un instrument destinat gestionării grupurilor de programe. La executarea comenzii make(1), make citește fișierul de reguli, „Makefile”, și actualizează o țintă dacă aceasta depinde de fișiere prealabile care au fost modificate de la ultima modificare a țintei respective sau dacă ținta nu există. Executarea acestor actualizări poate avea loc simultan.

Sintaxa fișierului de reguli este următoarea.

target: [ prerequisites ... ]
 [TAB]  command1
 [TAB]  -command2 # ignore errors
 [TAB]  @command3 # suppress echoing

Aici „[TAB]” reprezintă un cod TAB (codul de tabulare). Fiecare linie este interpretată de shell după ce se efectuează substituirea variabilelor. Folosiți „\” la sfârșitul unei linii pentru a continua scriptul. Folosiți „$$” pentru a introduce „$” ca valori de mediu pentru un script de shell.

Regulile implicite pentru țintă și condițiile prealabile pot fi formulate, de exemplu, după cum urmează.

%.o: %.c header.h

În acest caz, ținta conține caracterul „%” (exact unul). „%” poate corespunde oricărui subșir non-vid din numele de fișiere țintă efective. De asemenea, condițiile preliminare utilizează „%” pentru a ilustra modul în care numele lor se raportează la numele țintei efective.



Rulați «make -p -f/dev/null» pentru a vedea regulile interne automate.

Autotools este o suită de instrumente de programare concepută pentru a facilita portabilitatea pachetelor de cod sursă pe numeroase sisteme de tip Unix.

  • Autoconf este un instrument care generează un script shell „configure” din „configure.ac”.

    • «configure» este utilizat ulterior pentru a genera fișierul «Makefile» pornind de la șablonul „Makefile.in”.

  • Automake este un instrument care generează fișierul „Makefile.in” din fișierul „Makefile.am”.

  • Libtool este un script shell care rezolvă problema portabilității software-ului la compilarea bibliotecilor partajate din codul sursă.

Sistemul de construire a software-ului a evoluat:

  • Autotools, care a precedat Make, a reprezentat standardul de facto pentru infrastructura de compilare portabilă încă din anii 1990. Acesta este extrem de lent.

  • CMake, lansat inițial în 2000, a îmbunătățit semnificativ viteza, dar a fost construit inițial pe baza instrumentului Make, care este lent prin natura sa. În prezent, Ninja poate fi folosit ca motor al acestuia.

  • Ninja, lansat inițial în 2012, are rolul de a înlocui Make pentru a îmbunătăți și mai mult viteza de compilare și este conceput astfel încât fișierele sale de intrare să fie generate de un sistem de compilare de nivel superior.

  • Meson, lansat inițial în 2013, este un sistem de compilare de nivel superior, popular și rapid, care utilizează Ninja ca motor.

Consultați documentele disponibile la „Sistemul de compilare Meson” și „Sistemul de compilare Ninja”.

Paginile web dinamice și interactive simple pot fi create după cum urmează.

  • Întrebările sunt prezentate utilizatorului navigatorului folosind formulare HTML.

  • Completarea câmpurilor formularului și apăsarea butonului de trimitere trimite unul dintre următoarele șiruri URL cu parametri codificați din navigator către serverul web.

    • "https://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3"

    • "https://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3"

    • "https://www.foo.dom/program.php?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3"

  • %nn” din adresa URL este înlocuit cu un caracter cu valoarea hexazecimală nn.

  • Variabila de mediu este configurată astfel: "QUERY_STRING="VAR1=VAL1 VAR2=VAL2 VAR3=VAL3"".

  • Programul CGI (oricare dintre programele de tip „program.*”) de pe serverul web se execută cu variabila de mediu „$QUERY_STRING”.

  • stdout ieșirea standard a programului CGI este transmisă către navigatorul web și este afișată sub forma unei pagini web dinamice interactive.

Din motive de securitate, este recomandat să nu creați manual noi metode de analizare a parametrilor CGI. Există module consacrate pentru acest scop în Perl și Python. PHP include deja aceste funcționalități. Când este necesară stocarea datelor pe partea clientului, se utilizează cookie-urile HTTP. Când este necesară procesarea datelor pe partea clientului, se utilizează frecvent Javascript.

Pentru mai multe informații, consultați Common Gateway Interface, The Apache Software Foundation și JavaScript.

Căutarea expresiei „CGI tutorial” în Google, introducând adresa URL codificată https://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorial direct în bara de adrese a browserului, este o modalitate bună de a vedea scriptul CGI în acțiune pe serverul Google.

Există programe pentru conversia codurilor sursă.


Dacă doriți să creați un pachet Debian, citiți informațiile de mai jos.

Există pachete precum debmake, dh-make, dh-make-perl etc., care facilitează procesul de creare a pachetelor.



[7] Este posibil să fie necesare câteva ajustări pentru ca acestea să funcționeze în sistemul actual.