1.2 Lansarea şi terminarea execuţiei unui program
Pentru a începe execuţia unui program este necesar un apel sistem exec. Tratarea acestui apel sistem include căutarea unui fişier care conţine cod executabil, încărcarea în memorie a conţinutului (parţial sau total) al fişierului şi cedarea controlului către acest program Programului îi este adăugată, de către compilatorul C şi editorul de legături, o funcţie specială numită rutina de start C, care va primi controlul la pornirea programului şi din care va fi apelată funcţia main a programului. Rutina de start mai are şi rolul de a prelua de la nucleul UNIX argumentele din linia de comandă prin care este lansat programul, precum şi variabilele de ambianţă.
Când controlul este la funcţia main, pot fi apelate alte funcţii definite de utilizator sau pot fi solicitate apeluri sistem. Terminarea execuţiei se poate produce normal sau anormal. Terminarea normală poate fi realizată:
- prin revenirea naturală din funcţia main
- prin apelul sistem exit
- prin apelul sistem _exit
Terminarea anormală se produce când:
- se apelează abort
- procesul primeşte un semnal
Prototipurile apelurilor sistem exit şi _exit sunt:
#include
void exit(int status);
#include
void _exit(int status);
Argumentul celor două funcţii este un întreg prin care programul poate transmite starea de terminare a procesului. Apelul exit are ca rol principal să asigure la terminarea programului tratarea corespunzătoare a operaţiilor de introducere/extragere încă în curs, golirea tampoanelor utilizate pentru acest proces, apoi închiderea fişierelor încă deschise. Prin apelul _exit controlul este redat nucleului.
Pentru compilarea unui program se dă comanda:
[...@... ...]$ gcc program.c
unde program.c este numele programului sursă scris în limbajul C. În urma compilării va rezulta un fişier executabil.
Rularea programului se face prin tastarea numelui acestuia, urmată de tastare ENTER:
... $ nume_program
Unele din cel mai des utilizate opţiuni de compilare sunt:
-c
gcc fişier1.c fişier2.c ...... -c executable
Obligă compilatorul să nu scoată formatul executabil ci doar fişierele intermediare, cu extensia .o, urmând ca asamblarea lor în fişierul executabil să se facă prin comanda: gcc filier1.o fişier2.o ...... -o executable
-llibrary
Link-editeaza sursa utilizând librăria specificată în această opţiune. Opţiunea trebuie să urmeze după fişierele sursă C. Librăriile pot fi cele sistem sau chiar create de către
Fig. 1. Modelul compilatorului de C
utilizator. În general atunci când utilizăm funcţiile matematice va trebui să includem declaraţiile lor printr-o
directivă de preprocesare şi să includem biblioteca la linkeditare astfel: gcc calc.c -o calc -lm
-Ipathname
Adaugă o cale unde compilatorul va căuta fişierele ce apar în directivele: #include<...>. Implicit preprocesorul va căuta fişierele în directorul curent, apoi în directoarele specificate prin opţiunea –I şi abia în final în directorul /usr/include.
-g
Compilatorul va include cod de depanare în fişierul executabil.
Dostları ilə paylaş: |