Reteaua de calculatoare

Sa se scrie un program C care simuleaza o retea (simplificata) de calculatoare conectate in inel. Reteaua contine un numar de N > 1 statii, unde N este dat ca parametru la lansarea in executie a programului. Fiecare statie este simulata printr-un proces si are o adresa unica (ex. 0, 1, 2 ... N - 1). Statiile (procesele) sunt conectate intre ele prin pipe-uri ca in figura (in figura N = 4).

In retea circula in mod continuu un singur pachet de dimensiune fixa cu urmatoarea structura:

Procesul initial va crea pipe-urile necesare, va crea procesele corespunzatoare statiilor, va introduce in retea pachetul in starea liber si cu campul S initializat cu N si apoi va astepta terminarea tuturor proceselor create.

Fiecare statie i transmite un numar Mi >= 1 mesaje (Mi este stabilit aleator pt. fiecare statie in parte si NUMAI statia i cunoaste Mi) catre o destinatie aleatoare (se accepta trimiterea unui mesaj chiar spre ea insasi; obligatoriu statia cu acea adresa trebuie sa existe). In momentul in care statia i transmite ultimul sau mesaj, ea va avea grija sa decrementeze campul S din pachet.

O statie (proces) i se comporta in urmatorul mod:

Clarificare la punctele (*): Daca statia i a transmis deja toate cele Mi mesaje, ea nu va transmite mesaje. Faptul ca o statie i nu a transmis inca cele Mi mesaje proprii, NU inseamna ca ea va trimite unul chiar la acel moment; se stabileste aleator daca vrea sau nu sa trimita exact la acel moment.

Daca este posibil ( ;-) ), sa se scrie simulatorul in asa fel incat programul sa se termine doar cand nimeni nu mai vrea sa transmita mesaje, stiind ca NUMAI statia (procesul) cu adresa 0 poate sa-si termine executia testand valoarea campului S al pachetului si este INTERZISA utilizarea altor forme de comunicare intre procese (ex. semnale, memorie partajata, etc) cu exceptia pipe-urilor. NU se accepta nici trimiterea de mesaje suplimentare speciale pentru terminare.

NOTA Pentru a obtine numere intregi aleatoare puteti folosii functia de biblioteca rand() care la fiecare apel furnizeaza un intreg pseudoaleator in intervalul 0 - RAND_MAX. Pentru ca aceasta functie sa functioneze "corespunzator" trebuie setata asa numita samanta (seed) utilizand functia srand(unsigned int). Mai mult, ea trebuie sa difere de la o rulare la alta a programului. Acest lucru se poate realiza utilizand valoarea timpului curent ce poate fi obtinuta prin apelul sistem time(). Prin urmare, inainte de a utiliza rand() trebuie sa avem un apel de genul srand(time()). Detalii pe paginile de manual corespunzatoare.