Sisteme de operare: introducere

Notă: mare parte din acest material a fost preluat de la dl. Marius Minea din introducerea pentru laboratorul de "Programarea Calculatoarelor".

Mediul de lucru

Laboratoarele la aceasta disciplina se desfăşoară pe calculatoare cu sistem de operare Linux, mai precis distributia KUbuntu.

Comenzi Unix

UNIX are un sistem de fişiere arborescent. Spre deosebire de sistemul de fisiere DOS/Windows, separatorul între componentele numelui de fişier (directoare şi numele propriu-zis) este caracterul / (slash) şi nu \ (backslash). De asemenea, numele de fişiere nu conţin un identificator al discului fizic (A:, C:, etc.), ci întreaga ierarhie de fişiere porneşte de la o rădăcină unică, notată /. În continuare, numele comenzilor sunt scrise cu caractere tip maşină de scris, argumentele lor sunt scrise cursiv, iar textul între [ ] denotă un argument opţional. Cîteva comenzi de bază sunt: Pentru o navigare şi manipulare mai facilă a fişierelor se poate folosi programul Midnight Commander (mc), similar lui Norton Commander/Total Commander din mediul DOS/Windows.

Compilatorul gcc

Compilatorul gcc (GNU Compiler Collection) este unul din cele mai performante compilatoare pentru limbajul C, şi e realizat în acelaşi model de distribuţie gratuită a sursei ca şi celelalte componente ale sistemului GNU/Linux.
Fişierele sursă au în mod convenţional extensia .c. Obişnuit, pentru a compila programul nume.c, se execută comanda
gcc -o nume nume.c
Argumentul nume al opţiunii -o indică numele dat executabilului (de obicei, acelaşi nume de bază ca şi pentru sursă dar nu neapărat). Dacă nu se foloseşte opţiunea -o nume, executabilul e denumit implicit a.out. [În UNIX, fişierele executabile nu sunt identificate prin extensie (cum ar fi .exe), ci printr-un atribut (permisiune de execuţie) care în acest caz e setat automat de compilator].
Pentru a compila programe cu funcţii matematice standard e nevoie de biblioteca libm. În acest caz, se foloseşte opţiunea -l urmată, fără spaţiu, de numele bibliotecii (fără prefixul lib folosit convenţional pentru toate bibliotecile). De exemplu:
gcc -lm -o prog prog.c
La fel atunci cînd folosim fire de excuţie pthreads avem nevoie de biblioteca libpthread, deci vom adăuga opţiunea -lpthread.
La compilare, e utila generarea cat mai multor avertismente. Aceasta se specifica cu optiunea -Wall (warnings: all).
Opţiunile la compilare pot fi introduse în orice ordine. E important de înţeles că -o nume e o singură opţiune, chiar dacă e formată din două cuvinte separate prin spaţii. E incorectă intercalarea altor opţiuni între -o şi nume. De exemplu, în comanda
gcc -o -Wall nume nume.c
se interpretează -Wall ca nume dorit al fişierului de ieşire.
Alte opţiuni pentru gcc vor fi discutate ulterior.

Erori de compilare

Pentru început, scrieţi şi compilaţi următorul program simplu, care afişează faloarea lui pi calculată cu ajutorul funcţiei arcsinus, prezentă cu numele asin în biblioteca standard de funcţii matematice.
#include <math.h>
#include <stdio.h>

int main(void)
{
  printf("Valoarea lui pi este: ");
  printf("%f", 2 * asin(1));
  return 0;
}
E important să urmărim cu atenţie şi să înţelegem eventualele mesaje de apărute la compilare, pentru a putea corecta erorile semnalate. Cîteva exemple de erori care pot apărea la transcrierea greşită a acestui program:

error: studio.h: No such file or directory
Compilatorul nu a găsit fişierul indicat, deoarece a fost scris cu nume eronat: nu este studio.h, ci stdio.h, de la Standard Input/Output.

error: syntax error before 'return'
Acest mesaj va apare dacă uităm să terminăm linia anterioară cu punct-virgulă. E important de reţinut că adesea cauza reală a erorii poate să se afle de fapt puţin înainte de locul în care o detectează compilatorul. Acesta indică locul presupusei erori prin numele de fişier urmat de numărul liniei sursă, de exemplu: /home/student/pi.c:8:error: ...

error: syntax error at end of input
Această eroare va fi semnalată dacă se uită acoloada închisă } şi deci fişierul se termină în mod neaşteptat.

Rularea programelor și linia de comandă

Fie următorul program, să-l numim myecho.c:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i;
  
  for (i=1; i<argc; i++)
    printf("Argumentul %d este: %s\n", i, argv[i]);

  exit(0);
}

Să presupunem că am compilat în diretorul curent programul myecho.c, folosind comanda:

gcc -o myecho myecho.c

Cum lansăm această comandă în execuție? Vom utiliza următoarea linie de comandă:

./myecho arg1 arg2 arg3 gata

Să analizăm această linie (notăm cu simbolul ◊ un caracter spațiu):

./myechoarg1arg2arg3gata