Sunteți pe pagina 1din 2

Subiecte SO 31 Ian 2017

1.1 La primul un for de la i=0;i<10;i++ care apela un fork() si intrebarea era ce afiseaza.
1.Cate procese se vor crea in urma rularii urmatoarei bucati de cod (incluzand si procesul
initial)? Pentru n=10?

for(i-0;i<n;++i)
fork();

Raspuns:
2^n procese daca e luat in considerare si cel initial
n=10 => 2^10 = 1024

2.2. La al doilea se apela ./prog 5, si se reapela programul folosind execv(prog, argumente) si


practic intra intr-o bucla infinita.
2. Bucata de cod - nu mai stiu exact cum era, dar raspunsul era ca afiseaza aaaaaa la infinit. La
un moment dat aparea in cod execv(argv[0],argv).
Se rula ./prog 5 si undeva in cod se decrementa acest 5, dar de fapt era o variabila locala si apoi
nu mai este folosita, adica in execv nu se da variabila decrementata, se da tot parametru 5 =>
ruleaza la infinit. Se va opri daca se opreste manual sau se umple memoria.

3.3. Al treilea era ceva cu pipe-uri si dup (ceva de duplicare pe la pipe-uri).


3. Ceva cu pipe

4.4. Problema sa se scrie o functie care primeste ca param numele unui fiser, si doua caractere
cs,cd. Se cerere sa se schimbe toate aparitiile lui cs cu cd si sa se returneze numarul de litere
modificate (fara sa se foloseasca chestii alternative, gen vectori si etc, adica sa se lucreze direct pe
fisier).
4. Schimbare ca cu cd dintr-un fisier fara a folosi variabile ajutatoare

5.5. Al 5-lea cu directoare si stuctura arborescenta.


5. Sa afisezi fisierele dintr-un director...am scris ceva din curs, nu cred ca e bine.

6. Al 6-lea cu Semnale, procese tata-fiu care erau la capetele unui PIPE.


REZOLVARI :
Exercitiul 1:
Procese copil au copii locale ale variabilelor, deci orice operaie asupra variabilelor, nu va afecta
copia printelui sau copia altui copil.
Sa consideram un program care face loop de 2 ori:
1)Procesul printe (P0) trece prin bucla de 2 ori, prin urmare, crearea a 2 procese copil (P1 i
P2). Aceste procese copil obtine copiile lor locale de 'i' , notat cu 1 pentru primul copil i cu 2
pentru al doilea copil.
Astfel, P2 trece prin bucla o singura data , n timp ce P1 trece prin bucla de 2 ori.
Not: Procesul copil ncepe s execute intotdeauna de la instruciunea imediata de dup fork() ,
care este i ++ n cazul nostru.
2) P2 incrementeaza pe i de la 2 la 3, urmand sa se faca comparaia "i <N", care este evaluata
ca fiind falsa. Prin urmare, P2 nu creeaz niciun proces.
3) P1 incrementeaza pe i de la 1 la 2, apoi se execut fork() , care creeaz un alt copil cu i ca
fiind 2, acest lucrul permite s numeasca acest copil "P1_1". Dupa aceea incrementeaza pe i la
2 la 3 i iese din bucla.
4) P1_1 incrementeaza pe i de la 2 la 3 i iese din bucla.
Astfel, la finalul buclei vom avea 3 copii (P1, P2, P1_1).
Acum sa ne dam seama de numrul de copii pentru un program cu 'N' bucle.
Pn s fie al n-lea copil al procesului printe , Pn_n s fie al n-lea copil al celui de-al n-lea copil al
procesului printe i aa mai departe.
Copiii cu "i" ca 1: 1 (P1)
Copiii cu 'i' ca 2: 2 (P1_1, P2)
Copiii cu "i" ca 3: 4 (P1_2, P2_1, P3, P1_1_1)
Numrul de copii cu "i" ca N: 2 ^ (n-1)
Astfel, numrul total de precese copil create este:
{1 (2 ^ n - 1)} {2 - 1} = 2 ^ n - 1
Deci, pe scurt 2 ^ 10-1 procese vor lua nastere din for ul de mai sus.
Nr de procese copil : 2^10-1
Nr total de procese : 2^10.
Fiecare proces care execut un fork () se transform n dou procese (cu excepia celor n
condiii de eroare neobinuite sau n cazul n care fork () ar putea eua).
Dac printele i copilul menin executarea aceluiai cod (adic nu verific valoarea returnat
de fork (), sau propriile lor procese ID i ramura pentru diferite ci de cod bazate pe ea), apoi fiecare
fork ulterior va dubla numrul proceselor. Deci, da, dup n fork uri , vom avea 2^n procese n total.

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