Documente Academic
Documente Profesional
Documente Cultură
Crearea programului
Pentru crearea unui program in C pe o platforma Linux se va folosi un editor normal de
texte ca de exemplu utilitarul joe. O alta varianta este sa utilizam editorul intern din Midnight
Commander ( mc ).
Compilarea
Compilarea se va face din prompterul SO Linux prin lansarea unuia din compilatoarele puse
la dispozitie de catre acesta. Unul din compilatoare este cc si este compilatorul implicit pe statiile
Sun iar celalalt este gcc-ul fiind unul din cele mai populare compilatoare in lumea UNIX.
Despre modul de lucru cu aceste compilatoare se va apela pagina de manual asociata acestor
compilatoare, astfel:
unde program.c este numele programului sursa scris in limbajul C. In mod implicit, in urma
compilarii, va rezulta un fisier executabil avand numele a.out. Pentru a scoate fisierul executabil (
binal) cu un alt nume se va utiliza optiunea –o prezenta pe mai toate compilatoarele de C.
#include<stdio.h>
void main( void )
{
printf("\nHello!);
}
1/4
Sisteme de Operare - 6 note de curs – Masterat in Informatica
Rularea programului
Lansarea in executie se va face prin tastarea numelui programului ( executabil, binar) la prompterul
SO, astfel:
apollo$ program<ENTER>
Modelul compilatorului de C
Preprocesorul
2
Sisteme de Operare - 6 note de curs – Masterat in Informatica
Compilatorul de C
Assembler-ul
Creaza codul obiect pornind de la sursele deja convertite in limbaj de asamblare. Va genera
fisiere cu extensia .o (in DOS erau fisierele obj).
Link-editorul
Daca programul este realizat din mai multe fisiere sursa C, iar aceste fisiere folosesc
variabile externe, link-editorul este componenta care va realiza legatura intre definitia variabilei ( in
unul din fisiere) si utilizarea ei. Tot in faza delink-editare se face legatura intre apelul functiei si
biblioteca unde apare definitia ei, sau intre apelul functiei si definitia ei, definitie ce poate aparea
intr-un alt fisier al proiectului.
Intelegand modul in care compilatorul face conversia unui program de la codul sursa C la
codul executabil vom fi capabili sa intelegem si utilitatea urmatoarelor optiuni de compilare, astfel:
-c
gcc file1.c file2.c ...... -c executable
-llibrary
Linkediteaza sursa utilizand libraria specificata in aceasta optiune. Optiunea trebuie sa
urmeze dupa fisierele sursa C. Librariile pot fi cele sistem sau chiar create de catre utilizator. In
general atunci cand utilizam functiile matematice va trebui sa includem declaratiile lor printr-o
directiva de preprocesare de genul: #include<math.h> si trebuie sa includem biblioteca matematica
la linkeditare de genul:
-Ipathname
Adauga o cale unde compilatorul va cauta fisierele ce apar in directivele: #include<...>
Implicit preprocesorul va cauta fisierele in directorul curent, apoi in directoarele specificate prin
optiunea –I si abia in final in directorul /usr/include.
-g
Compilatorul va include cod de depanare in fisierul executabil.
3
Sisteme de Operare - 6 note de curs – Masterat in Informatica
Cautarea informatiilor suplimentare despre o anumita functie se face prin apelarea paginii
de manual ( acestea fiind memorate in zona 3 a acestui manual, iar alte apeluri sistem sunt incluze
in zona 2 a manualului), astfel:
Utilizare:
char *cp;
cp = malloc(100);
sau
int *ip;
ip = (int *) malloc(100*sizeof(int));
in ambele cazuri dealocarea se face:
free( cp );
free( ip );
calloc si realloc
Acestea sunt doua functii aditionale utilizate in gestiunea memoriei alocate dinamic, avand
urmatoarele prototipuri:
Functia calloc va fi utilizata in locul functiei malloc daca dorim ca zona de memorie alocata
sa fie si initializata cu valoarea 0 ( zero ).
int *ip;
ip = (int *) calloc(100, sizeof(int));
Functia realloc este utilizata pentru modificarea dimensiunii zonei alocate dinamic. Aceasta
zona poate fi mai mica sau mai mare decat zona initiala. Daca poate adauga zonei initiale o noua
zona functia va returna adresa veche iar in caz contrar aloca o noua zona si copie continutul vechi.
Daca alocarea a fost facuta cu succes se va returna adresa de inceput iar in caz contrar valoarea
NULL. Primul argument al functiei este adresa initiala a zone, iar argumentul doi este dimensiunea
noiii zone ce urmeaza a fi alocata.