Problemele urmatoare se vor rezolva numai sub sistemul de operare Linux/Unix. Pentru comunicare intre procese se vor folosi: fisiere, pipe sau fifo-uri.


1. Procesul parinte scrie un nume in fisierul text 'nume.txt' si creaza doi fii. Primul fiu citeste numele si executa una din urmatoarele actiuni: - in cazul in care numele citit e un nume de fisier ii scrie continutul in fisierul continut.txt - in caz contrar scrie in fisier mesajul 'Numele nu e al unui fisier..' Al doilea fiu citeste si el numele si executa una din urmatoarele actiuni: - in cazul in care numele reprezinta un nume de director scrie continutul directorului (asa cum e el intors de comanda 'ls') in fisierul continut.txt - in caz contrar scrie in fisier mesajul 'Numele nu e al unui director..' Obs. un singur proces fiu are acces la fisierul 'continut.txt' la un moment dat (accesul la fisier va fi sincronizat).

2. Dandu-se un fisier text, sa se creeze cate un proces fiu pentru fiecare litera din alfabet ('a', 'b', ... 'z'). Procesul corespunzator literei 'a' va cauta in acel fisier text toate cuvintele care incep cu litera 'a' si le va scrie intr-un fisier a.txt. De asemenea, acest proces ii va comunica procesului parinte numarul de cuvinte care incep cu litera 'a' din fisierul text. Procesul corespunzator literei 'b' va efectua aceeasi operatiune, doar ca el cauta toate cuvintele care incep cu 'b' si le va scrie in b.txt. La fel decurg lucrurile pentru toate celelalte procese fiu. In final, procesul parinte va afisa o statistica care sa cuprinda numarul de cuvinte care incep cu litera 'a', numarul de cuvinte care incep cu 'b', s.a.m.d.

3. Un proces parinte scrie in fisierul 'utilizatori.txt' numele a n utilizatori. Apoi creaza n procese fiu. Procesul cu numarul i verifica daca utilizatorul de pe linia i a fisierului este conectat sau nu. In cazul in care acesta e conectat afiseaza pe ecran numele utilizatorului, statia de la care e logat si ora logarii. In caz contrar afiseaza mesajul 'Utilizatorul <> nu e conectat..' Obs. un singur proces fiu are acces la fisierul 'utilizatori.txt' la un moment dat (accesul la fisier va fi sincronizat).

4. Dandu-se o expresie aritmetica (care sa contina numere intregi si operatorii +, -, *, /, %) sa se creeze o structura adecvata de procese care sa evalueze valoarea expresiei. Astfel, un anumit proces va primi de la procesul lui parinte o expresie, iar daca contine cel putin un operator, va creea doi fii care vor evalua cei doi operanzi (un proces fiu pt operandul din stanga si alt proces fiu pt cel din drepata) si va returna parintelui valoarea expresiei pe care a primit-o de la el. Daca expresia primita de un proces de la parintele lui este banala (i.e., un numar) aunci acesta returneaza valoarea asa cum este parintelui sau.

5. Un proces parinte scrie in fisierul 'drepturi.txt' n perechi de forma 'nume_fisier numar_octal'. Apoi creaza n procese fiu. Fiecare proces fiu citeste o linie din fisier si verifica daca nume_fisier are drepturile specificate de numar_octal. Daca drepturile coincid se afiseaza mesajul 'Pentru fisierul <> drepturile coincid..'. In caz contrar, va seta drepturile pentru nume_fisier conform numarului octal indicat si va afisa mesajul 'Pentru fisierul <> drepturile de acces au fost modificate in <>..' Obs. un singur proces fiu are acces la fisierul 'drepturi.txt' la un moment dat (accesul la fisier va fi sincronizat).

6. Sa se scrie un program care creand o structura adecvata de procese sa calculeze produsul a doua matrici. Fiecare proces (frunza - un proces care nu mai are fii) va efectua exact o singura operatie de inmultire.

7. Un proces parinte creaza un fisier 'comenzi.txt' in care scrie n comenzi Unix. Apoi creaza n procese fiu. Fiecare proces fiu citeste o linie din fisier, executa comanda de pe linie si afiseaza la iesirea standard rezultatul executiei. In cazul in care comanda e invalida se cere scrierea unui mesaj corespunzator in fisierul comenzi.txt. Obs. un singur proces fiu are acces la fisierul 'comenzi.txt' la un moment dat (accesul la fisier va fi sincronizat).

8. Sa se scrie un program care primeste ca argumente (in linia de comanda) mai multe comenzi. Pentru fiecare din aceste comenzi, programul va creea cate un proces fiu care va supraveghea vreme de 10 secunde (din secunda in secunda) cine executa comanda respectiva in sistem.

9. Un proces parinte scrie in fisierul 'cuvinte.txt' n perechi de forma 'cuvint nume_fisier'. Apoi creaza n procese fiu. Fiecare proces fiu verifica pentru o linie daca in nume_fisier apare cuvintul cuvint si afiseaza la iesirea standard numarul de aparitii al lui cuvint in fisier, precum si numarul de linii din fisier in care acesta apare. Obs. un singur proces fiu are acces la fisierul 'cuvinte.txt' la un moment dat (accesul la fisier va fi sincronizat).

10. Sa se simuleze functionarea unui calculator aritmetic. Un program va citi de la intrarea standard expresii aritmetice simple, de forma "operand1 operator operand2", unde operand1 si operand2 sunt numere intregi si operator este unul dintre +, -, *, /, %. Programul va calcula valoarea expresiei si o va afisa pe iesirea standard. Calculul expresiei aritmetice are loc in felul urmator: la pornirea programului, acesta va creea 5 procese fiu, cate unul pentru fiecare operator binar (+, -, *, /, %), astfel incat fiecare dintre cele 5 procese stie sa evalueze un singur operator din cei 5 (un proces stie sa calculeze numai adunari, altul numai scaderi, ..). Dupa ce programul principal va citi o expresie de la intrarea standard, el va determina ce tip de operator contine si o va trimite procesului fiu corespunzator; acesta din urma va evalua expresia si va trimite rezultatul inapoi parintelui care il va afisa pe ecran.

11. Un proces parinte scrie in fisierul 'directoare.txt' n perechi de forma 'text nume_director'. Apoi creaza n procese fiu. Pentru o linie, un proces fiu afiseaza la iesirea standard numele tuturor fisierelor text din directorul nume_director care contin stringul text. Obs. un singur proces fiu are acces la fisierul 'directoare.txt' la un moment dat (accesul la fisier va fi sincronizat).

12. Sa se scrie un program de tip 'proxy' care sa permita la doua procese sa dialogheze/comunice prin intermediul lui. Astfel, se vor creea 3 procese si se cere ca doua dintre ele sa comunice prin intermediul celui de-al treilea (ex.: procesul A care vrea sa comunice cu procesul B, va comunica intai cu procesul C care va trimite datele primite de la A mai departe la B; la fel se intampla si in cazul lui B care vrea sa comunice cu A)

13. Un proces parinte scrie in fisierul 'comenzi.txt' n comezi Unix. Apoi creaza n procese fiu. Pentru o linie, un proces fiu afiseaza numele complet si statiile de pe care s-au facut ultimele 3 logari ale utilizatorilor care executa la acel moment comanda. Obs. un singur proces fiu are acces la fisierul 'comenzi.txt' la un moment dat (accesul la fisier va fi sincronizat).

14. Sa se calculeze suma unui sir de numere folosind metoda divide et impera: un proces imparte sirul in doua subsiruri pe care le da altor doua procese (fii) sa le calculeze suma, dupa care aduna cele doua rezultate obtinute. Procesele fii aplica in continuare aceeasi tehnica.

15. Un proces parinte scrie in fisierul 'nume.txt' n nume de fisiere. Apoi creaza n procese fiu. Pentru o linie, un proces fiu afiseaza numele tuturor directoarelor care contin fisierul respectiv precum si primele si ultimele 5 linii din fisier. Obs. un singur proces fiu are acces la fisierul 'nume.txt' la un moment dat (accesul la fisier va fi sincronizat).