Sunteți pe pagina 1din 4

Cursul 6

Programare C sub Linux

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:

[remus@apollo work]$ man cc


sau
[remus@apollo work]$ man gcc

Comanda implicita ce se va da pentru compilarea unui program este:


[remus@apollo work]$ gcc program.c

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.

[remus@apollo work]$ cc -o program program.c

Astfel programul executabil, in urma acestei compilari, va avea numele program.


Tot in faza compilari putem intalni situatia diferitelor erori de sintaxa in scrierea
programului C. Acestea sunt semnalizate de catre compilator ca in exemplul de mai jos:
Fisierul sursa este:

#include<stdio.h>
void main( void )
{
printf("\nHello!);
}

Mesajele generate in timpul compilarii sunt:

[remus@apollo work]$ gcc test1.c


test1.c:4:16: missing terminating " character
test1.c:5:1: warning: no newline at end of file
[remus@apollo work]$

1/4
Sisteme de Operare - 6 note de curs – Masterat in Informatica

Primul mesaj ne avertizeaza ca pe linia 4, coloana 16 este eroarea: - missing


terminating " character – ( caracterul terminal “ este omis )
Al doilea mesaj este doar un avertisment ( warning ) si ne spune ca pe linia 5, coloana 1 nu
apare caracterul NewLine, adica, orisice program C in Linux se va remina cu caracterul Linie Noua
( enter).
Corectarea erorilor se va face prin deplasarea cursorului pe pozitia respectiva ( sau in zona
acelei pozitii ) si corectarea sursei dupa indicatiile date de catre compilator.

Rularea programului
Lansarea in executie se va face prin tastarea numelui programului ( executabil, binar) la prompterul
SO, astfel:
apollo$ program<ENTER>

In acest moment programul va interactiona cu consolele SO si va afisa pe ecran toate


mesajele. Tot in acest stadiu putem constata faptul ca functionarea nu este corecta. Pentru corectare
vom intra din nou in editor, modificam sursa si reluam pasii anteriori: salvare sursa, compilare,
executie.

Modelul compilatorului de C

Preprocesorul

Accepta la intrare codul sursa C si este responsabil pentru urmatoarele:


- elimina comentariile
- interpreteaza directivele speciale prefixae de simbolul #

2
Sisteme de Operare - 6 note de curs – Masterat in Informatica

Compilatorul de C

Primeste la intrare fisierele sursa C, deja analizate si prelucrate de catre preprocesor si va


genera codul in limbaj de asambblare.

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.

Optiuni de compilare mai des utilizate

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

Obliga compilatorul sa nu scoata formatul executabil ci doar fisierele intermediare, cu


extensia .o, urmand ca “asamblarea” lor in fisierul executabil sa se faca prin comanda:

gcc file1.o file2.o ...... -o 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:

gcc calc.c -o calc -lm

-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.

gcc prog.c -I/home/myname/myheaders

-g
Compilatorul va include cod de depanare in fisierul executabil.

3
Sisteme de Operare - 6 note de curs – Masterat in Informatica

Functii din libraria C-ului

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:

man 3 sqrt sau simplu man sqrt

Functii ale SO din C


Alocare dinamica de memorie
malloc si free
Aceste doua functii se vor utiliza ca si in C-ul de sub DOS. Prototipurile lor sunt:
void *malloc(size_t number_of_bytes)
void free(void* adr);

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:

void *calloc(size_t num_elements, size_t element_size};


void *realloc( void *ptr, size_t new_size);

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.

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