Programare UNIX


1. Semnale

 


Laborator 4

Modul de lucru:

Arhiva cu exemplele pentru laborator o gasiti aici.

Tema:

1. [La laborator]

Scrieti un program UNIX in C care realizeaza urmatoarele:

a. Sistemul este format din doua procese: parinte si fiu

b. Fiul ignora semnalul SIG_TERM

c. Parintele instaleaza o alarma care il va intrerupe dupa 7 secunde; intre timp, va afisa pe ecran, in mod continuu, caracterul 'A'. La primirea semnalului de alarma va anunta fiul prin semnalul SIGUSR1, dar va continua sa afiseze (la infinit) caracterul 'A'

d. Fiul afiseaza continuu caracterul 'B', pana in momentul in care primeste semnalul SIGUSR1, moment in care afiseaza un mesaj si se termina

e. Cand fiul se termina, parintele preia starea lui si se termina si el

Vor fi folosite functii de tratare a semnalelor (una pentru generarea SIGUSR1 in parinte si doua pentru terminarea proceselor parinte si fiu) si functiile alarm(), kill().

Indicatie: in UNIX, cand un proces fiu se termina, parintele primeste automat semnalul SIGCHLD.

Nota: Pentru captarea semnalelor se va folosi sigaction(). Daca se doreste, se poate realiza in plus si o varianta cu signal().

2. [Homework]

Scrieti un program UNIX in C care realizeaza urmatoarele:

a. Procesul parinte creeaza doua procese fiu, fiul 1 si fiul 2.

b. Procesul fiu 1 citeste, la fiecare 10 secunde, cate o linie de text dintr-un fisier text cu nume prestabilit (hard-coded). Cand se termina fisierul, fiul 1 intra intr-o bucla infinita.

c. Procesul parinte preia, la fiecare 15 secunde, liniile de text citite de fiul 1, separate prin CRLF (Carriage Return + Line Feed, coduri ASCII #13#10) folosind orice mecanism cunoscut de comunicare inter-proces. Cand se termina procesul fiu 1, parintele forteaza terminarea procesului fiu 2, dupa care (dupa ce s-a asigurat ca procesul fiu 2 s-a terminat) se termina si el.

c. Procesul fiu 2 (watchdog) transmite, la fiecare 30 de secunde, un semnal procesului parinte, interogandu-l cate linii a citit de la ultima interogare, de la procesul fiu 1. Daca numarul de linii este egal cu 0, procesul fiu 2 forteaza terminarea procesului fiu 1, dupa care isi continua executia.