Sunteți pe pagina 1din 16

Sisteme de Operare

Curs 5
Mecanismele fork, exec

Informatiile necesare gestiunii unui proces Unix


Tabela de procese

Proces activ

Spatiu rezident
Spatiu evacuabil
Context
utilizator

Spatiu de adresare
nucleu

Instruictiuni si
date

Spatiu de adresare
utilizator

Procese reentrante
Tabela de procese
Proces a

Proces b

Rezident
Context utilizator b

Evacuabil

Date a

Text pur

Context utilizator a

Date b
Spatiu nucleu

Spatiu utilizator

Apeluri sistem: fork, exit


int fork()

Creaza un proces fiu


Mosteneste tabela de descr fisiere

int exit(stare)

Termina procesul curent si intoarce un cod


de retur.
Daca procesul parinte nu mai exista fiul
devine orfan (se ataseaza la procesul init) zombie

Apeluri sistem:wait
int wait(int *stare);
Fiu(exit)=> stare=Cod retur(8b) 0(8b)

Fiu terminat la semnal sistem:


stare=0(8b) flagsmnal(1b) SemnalNo(7b)

Fiu terminat in cursul depanarii:


stare=SemnalNo(8b) 0x7f(8b)
Retur: pid-ul procesului fiu terminat

Waitpid
int waitpid(int pid, int *stare, int optiuni);
Pid > 0 asteapta fiu cu fpid=pid
Pid ==0 oricare din procesele din acelasi process
grup
Pid == -1 identic wait
Pid < -1 asteapta fiul avand fpid=pid (idem pid>0)
Retur: pid-ul fiului terminat sau 1(eroare)

Exemplul 1 fork
Proces care creaza un fiu.
Ambele tiparesc cate un mesaj intr-o
bucla for.

Exemplul 2 fork
Anexa 1

Exemplul 3 fork
Anexa 2

Familia exec
Int execv(char* cale, char** argv);
int execl(char* cale, char *arg0, , char*argn, NULL);
Int execve(char*cale,char**argv, char**envp);
Int execle(char* cale, char *arg0, , char*argn, NULL, char**envp);

Int execvp(char*fisier,char**argv);
Int execlp(char*fisier, char *arg0, , char*argn, NULL);

Familia exec -2
Fisier va fi cautat in PATH
Cale calea completa spre fis de
executat.
Envp- tablou de nume=val\0 terminat
de NULL.

Familia exec 3
Lanseaza in executie un nou program in
cadrul aceluiasi proces
Program binar sau #! interpreter [arg]
Criterii:

Modul de specificare a caii relativ (si path) si


absolut.
Mediul mostenit sau nou
Specificarea arg din linia de comanda (lista NULL
terminata sau tablou)

Familia exec -4
Dupa apelul exec instructiunea urmatoare din
program nu mai este atinsa decat in caz de
eroare !!!!!
Execlp, execl, execle param term de NULL
Execvp, execv, execve tablouri de pointeri
la argumente
Execlp, execvp fisier cautat in PATH
Execle, execve tablouri de pointeri la
variabilele de mediu

Arborele apelurilor exec


Calea spre
excutabil ?
Relativa cu
PATH

Absoluta

Mediul ?

Mostenit

Argumentele ?
Vector

execv

Lista

execl

Mediul ?

Nou

Mostenit

Nou

Argumentele ?

Argumentele ?
Vector

Lista

Vector

Lista

execve

execle

execvp

execlp

Nu exista

Contextul mostenit Exec


Programul lansat prin exec mosteneste de
la procesul parinte urmatoarele:
PID, PPID, GID, grupul de terminal, timpul
semnalului de alarma, directorul radacina, dir. Crt,
umask, UID, fisiere deschise si blocarile.
EUID, EGID pot fi schimbate

Contextul mostenit prin fork si exec


ATRIBUT
PID

MOSTENIT LA FORK RETINUT LA EXEC


Nu
Da(PID, PPID, GID)

UID
Date statice

Da
Copiate

Da
Nu

Stiva
Heap
Text(cod)

Copiata
Copiata
Partajat

Nu
Nu
Nu

Descr Fis

Copiate; poz crt partajata

Mediul

Da

De regula da. Se poate


evita (fcntl)
Depinde de apelul exec

Dir. Curent
Tratarea
semnalelor

Da
Copiata

Da
Partial