Sunteți pe pagina 1din 5

Lucrarea 3

Programare n C sub Linux


1. Introducere
C este un limbaj de programare de nivel nalt, care exist nc din primele zile ale existenei
sistemelor UNIX. Limbajul C a fost creat de Dennis Ritchie la Bell Laboratoires pentru a ajuta la
dezvoltarea sistemului de operare UNIX.
Printre motivele care au facut din C unul din cele mai folosite limbaje de programare la ora
actual:
- este un limbaj foarte portabil. Aproape toate calculatoarele i sistemele de operare dispun de
un compilator de C, iar sintaxa limbajului i biliotecile de funcii sunt standardizate.
- programele scrise n C sunt rapide
- C este limbajul de sistem pentru toate versiunile de UNIX.
Pentru a veni n ntmpinarea noilor cerine n materie de dezvoltare de programe, exist
extenii ale limbajului C, ca de exemplu C++ - limbaj de programare orientat pe obiecte.
Compilatorul de C care este disponibil pentru Linux se numete GNU C sau GCC.
Compilatorul este creat sub licena Free Software Foundation i poate fi distribuit n mod liber.

2. Desfurarea lucrrii
2.1. Compilatorul GNU C.
Compilatorul GNU C care este distribuit cu sistemul Linux este un compilator complet
operaional, compatibil ANSI C. Aceast lucrare presupune ca suntei familiari cu limbajul C.

2.1.1. Apelarea compilatorului.


Compilatorul este invocat n felul urmtor:
gcc [opiuni] [nume_fiiere]
Operaiile specificate de opiuni vor fi executate asupra fiecrui fiier care este specificat n
linia de comand. n continuare sunt descrise opiunile care sunt cel mai des utilizate.

2.1.2. Opiuni GCC


Exist mai mult de 100 de opiuni ale compilatorului, multe dintre ele probabil c nu le vei
folosi niciodat. O documentaie complet poate fi obinut cu "info gcc". Pentru a nva cum s
folosii texinfo, apelai "info info". Multe din opiunile GCC sunt formate din mai mult de un caracter,
de aceea este necesar ca fiecare opiune s nceap cu "-" (nu se pot grupa mai multe opiuni cu acelai
"-").
Dac compilai un program folosind GCC fr nici o opiune, va creea un fiier executabil cu
numele a.out. Exemplu:
gcc test.c
Pentru a specifica un alt nume pentru fiierul executabil, folosii opiunea "-o
nume_executabil":
gcc -o test test.c
Opiunea "-c": genereaz doar cod obiect (extensia .o), fr asamblare i editare de legturi.
Opiuni pentru depanare i monitorizare a timpului de execuie:
"-g": GCC va genera informaii folosite la depanare (cu depanatorul gdb)
"-pg": GCC va adauga cod suplimentar care, atunci cnd este executat, generaz informaii care
pot fi folosite de gprof pentru a afla detalii cu privire la viteza de execuie a programului.

2.2. Depanarea programelor folosind gdb


gdb este un depanator puternic, care poate fi folosit pentru depanarea programelor C i C++.
El permite inspectarea structurii interne a memoriei care este utilizat de program n timpul execuiei.
Cteva din funciile gdb:
- permite monitorizarea valorilor variabilelor programului.
- permite setarea punctelor de ntrerupere (breakpoints) care vor opri programul la o linie de
cod specificat.
- permite execuia pas cu pas a programului.

2.2.1. Apelarea gdb


gdb se apeleaz cu comanda "gdb [nume_executabil]". Pentru a afla mai multe despre gdb dai
"man gdb" sau "info gdb". Pentru a folosi corect depanatorul, nu uitai s compilai programul cu
opiunea "-g".

2.2.2. Comenzi de baz


file nume_executabil - ncarc programul executabil care urmeaz a fi depanat
kill - termin programul care este depanat
list - listeaz seciunile din codul surs care au fost folosite pentru a genera fiierul executabil
next - execut o linie de cod, fr a intra n alte funcii
step - execut o linie de cod, intrnd n funcii
run - execut programul care este n depanare
quit - iese din gdb
watch - permite examinarea unei variabile a programului ori de cte ori
variabila se modific
break - seteaz un punct de oprire (breakpoint). De fiecare dat cnd
programul ajunge n acest punct, se oprete
make - recompileaz programul fr a iei din gdb
shell - execut comenzi shell
help - informaii despre comenzi
gdb suport comenzile de editare ale shell-ului: TAB pentru completarea automat a
comenzilor, sgeile sus, jos pentru navigarea printre comenzile care au fost deja introduse.
Exemplu de sesiune gdb:
Folosind un editor de text simplu, introducei urmtorul program:
#include <stdio.h>
void my_print(char *);
void my_print2(char *);
main ()
{
char my_string[] = "salut";
my_print (my_string);
my_print2 (my_string);
}
void my_print (char *string)
{

printf ("irul este: %s\n", string);


}
void my_print2 (char *string)
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
string2[size+1] = '\0';
printf ("irul afiat invers: %s\n", string2);
}
Compilai programul cu numele salut (folosii -o) i executai-l. Observai c a doua linie nu a
afiat ceea ce trebuia. A doua linie trebuia s afieze:
irul afiat invers: tulas
S rezolvm problema folosind gdb. Mai nti, recomplilai programul folosind opiunea -g:
gcc -g -o salut salut.c
Apelai gdb:
gdb salut
sau
gdb
(gdb) file salut
care va ncarca programul salut. ncercai apoi:
(gdb) run
vei observa c programul ruleaz la fel, gdb specificnd i codul de ieire al programului. Codul de
ieire poate fi setat la o valoare dorit dac n program, funcia main este de tip int i este prezent n
program o instruciune return. Pentru a gsi problema, setai un breakpoint dup instruciunea for din
funcia my_print2. Pentru aceasta, listai codul surs folosind list:
(gdb) list
! apsnd Enter la promptul gdb vei repeta ultima comand introdus
Observai c fiecare linie ncepe cu un numr. Gsii numrul liniei specificate, dup care:
(gdb) break nr

Rulai programul cu run. Vei observa c programul se oprete la linia specificat. Ca s putei
s v dai seama de problem, urmrii valoarea lui string2[size-i]:

(gdb) watch string2[size-i]


n acest moment, gdb va opri programul de fiecare dat cnd valoarea specificat se modific. ntruct
am mai setat un breakpoint la aceeai linie, programul se va opri de dou ori n acelai loc. Pentru a
elimina aceast redundan, eliminai breakpoint-ul cu:
(gdb) disable 1
n care 1 nseamn primul breakpoint. Numerele breakpoint-urilor sunt date n ordinea n care au fost
setate. Continuai execuia cu:
(gdb) cont
! putei afia valoarea oricrei variabile sau expresii folosind comanda print expresie (ex. print i sau
print (size - i)).
Continuai executia, observnd de fiecare dat valorile expresiei afiate de watch. Se observ
c nu este nici o valoare asignat pentru string2[0]. ntruct malloc iniializeaz memoria alocat cu 0,
primul caracter al irului este 0. Reamintim c n C, irurile se termin cu \0. Acum, c v-ai dat seama
de problem, gsii o cale de a o rezolva.

2.3. make
make este unul din cele mai importante unelte folosite n dezvoltarea de soft pentru Linux.
make este un program care ine cont de dependenele dintre fiiere i actualizeaz doar acele fiiere
care au fost modificate de la ultima compilare.
make genereaz comenzi folosind un fiier descriptiv numit makefile. Aceste comenzi sunt
executate de shell. Acest fiier conine seturi de reguli care trebuie urmate cnd se actualizeaz un
program.

2.3.1. Formatul makefile


makefile e format din mai multe intrri. O intrare are forma:
int: dependeni
(TAB) list comenzi
De obicei, make se folosete astfel:
make int
inta: un nume ales de utilizator, atunci cnd se d comanda make int, se vor executa
comenzile indicate (compilri, mutri, copieri de fiiere).
dependeni: lista de fiiere obiect, separate prin ",", care vor fi
legate
Exemplu:
prg: main.o prg1.o prg2.o /usr/lib/lib1.a
cc -o prg main.o prg1.o prg2.o /usr/lib/lib1.a
main.o: main.c
cc -c main.c
prg1.o: prg1.c

cc -c prg1.c
prg2.o: prg2.s
as -o prg2.o prg2.s #prg2.s - surs n limbaj de asamblare

3. ntrebri i aplicaii
3.1. Explicai comanda: gcc -o file file.c -lm
3.2. Explicai utilitatea folosirii opiunii "-g" la compilarea unui program.
3.3. Explicai linia: string2=(char *) malloc(size + 1); din programul din platform.
3.4. Cum se lanseaz i cum se oprete debugerul gdb?
3.5. Explicai comenzile de baz "watch" i "shell" din debug-erul gdb.
3.6. Cum i cu ce scop se folosete comanda "break" n gdb?
3.7. Explicai diferena dintre comenzile "next" i "step" ale gdb-ului.
3.8. Explicai diferena dintre comenzile "run" i "make" ale gdb-ului.
3.9. Explicai ce face comanda "cont" n gdb i cum se anuleaz un breakpoint.
3.10. Ce este gcc-ul i la ce se folosete opiunea "-pg"?
3.11. Scriei un program care ordoneaz cresctor un ir de numere introduse de la tastatur.
3.12. Scriei un program care copiaz fisiere.
3.13. Scriei un program care afieaz numrul de apariii ale unui subir ntr-un ir.
3.14. S se scrie un program care afieaz n ordine invers literele unui ir de caractere citit de la
tastatur.
3.15. S se scrie un program care afieaz valorile funciei x*sin(x) pe intervalul [0,10], cu pasul 0.1.
3.16. S se scrie un program care genereaz 100 de numere aleatoare (numere ntregi inferioare lui
10000).
3.17. S se scrie un program care sorteaz cresctor 10 numere introduse de la tastatur.
3.18. S se scrie un program care numr elementele negative dintr-o secven de n elemente.
3.19. S se scrie un program care s transforme literele unui ir n litere mici.
3.20. S se scrie un program care s calculeze x la puterea y (unde x i y pot fi introduse de la
tastatur).

S-ar putea să vă placă și