Sunteți pe pagina 1din 5

Semnale

Daca se doreste ca un proces sa poata comunica cu un alt proces, trebuie sa se foloseasca mecanisme de comunicare
speciale gestionate de catre kernel.

Cateva metode de comunicare intre procese ar fi:

• fisiere - un proces scrie itnr-un fisier iar celalalt citeste


• semnale - se utilizeaza pentru a semnala asincron evenimente intre procese
• pipes - un pipe conecteaza iesirea standard a unui proces cu intrarea standard a altui process
• semafoare - sunt contoare utilizate pentru a gestiona accesul la resursele utilizate in comun de mai multe
procese. Cel mai des sunt folosite ca si mecanism de blocare a unei resurse pentru a preveni accesul simultan
a mai multor procese la o anumita resursa.

O caracteristica importanta a semnalelor este ca ele sunt asincrone, asta inseamna ca un proces poate primi un
semnal de la un alt proces in orice moment, iar procesul care a primit semnalul trebuie sa fie pregatit sa raspunda.

Daca un semnal apare in timpul executiei unui apel sistem, acest apel se incheie prin returnarea unui cod de eroare
(EINTR) si ramane in sarcina procesului sa refaca apelul intrerupt.

Exista numeroase semnale care pot fi accesate folosind constatele lor simbolice aferente.

Lista intreaga de semnale se poate vedea daca se ruleaza in terminal comanda: kill -l.

Cele mai frecvent utilizate semnale ar fi: SIGINT, SIGALRM, SIGUSR1, SIGUSR2, SIGKILL, SIGSTOP.

Orice semnal are asociata o actiune ce va fi executata de catre kernel asupra unui proces atunci cand procesul
primeste semnalul.

Un proces in mod implicit poate trata un mesaj in urmatoarele moduri:

• isi incheie executia


• ignora semnalul ( SIGKILL- termina executia procesului si SIGSTOP - opreste executia, cele 2 nu pot fi
ignorate)
• reface actiunea implicita a semnalului.

Deci, atunci cand intrerupem programul de la tastatura (trasmitem semnalul SIGINT), procesul isi opreste executia.
Acesta este handlerul semnalului, adica ce se intampla ca urmare a semnalului (sau mai precis actiunea ce va fi executata
de catre kernel).

Multe dintre semnale au un handler implicit.

Insa alternativ procesul poate specifica pentru un anumit semnal, propria rutina de tratare.

Signum este un numar intreg care indica semnalul ce va fi generat.

Handler este o referinta catre o functie ce va fi folosita ca rutina de tratare pentru semnalul respectiv.
Nu este nevoie de (void) inainte de signal.

Sau alternativa pentru handler:

Functia Signal leaga semnalul dat in parametrul 1 (SIGINT) de functia data in parametrul 2.

Semnalul SIGINT (signal interrupt) asteapta o intrerupere a programului de exemplu Ctrl-C.


In mod normal atunci cand se apasa Ctrl-C ar trebui ca programul sa isi intrerupa executia. Insa datorita faptului ca se ‘prinde’
semnalul SIGINT si rutina de tratare a semnalului este functia handler, programul nu isi va incheia executia la secventa Ctrl-
C.

Linia cu signal din functia handler, desi deja s-a creat o legatura intre semnalul sigint si handler in functia main, este relavanta
in functie de versiunea compilatorului. Pe versiuni mai noi de compilatoare C nu mai este nevoie de ea. Insa pe versiuni mai
vechi de compilatoare care erau instalate pe Linux era nevoie de refacerea legaturii dintre semnal si rutina de tratare
(handler) deoarece dupa primirea unui semnal se revenea la handlerul implicit (terminarea executiei programului).

Daca se doreste realizarea unui program similar dar care sa raspunda la secventa Ctrl-Z (SIGTSTP) trebuie schimbat doar
apelul signal:

Fiecare proces dispune de un ceas pe care il poate folosi pentru a-si trimite semnale de tipul SIGALRM dupa atingerea unui
anumit interval de timp.

Apelul sistem alarm asteapta n secunde dupa care trasmite semnalul SIGALRM.

Daca nu am avea apelul signal rezultatul ar fi:

Deci dupa 5 secunde apare semnalul SIGALRM si programul se incheie.

Daca dorim sa trimitem un semnal altui proces putem utiliza apelul sistem kill.

Semnatura metodei este:

Semnalul sig se va transmite catre procesul cu PID-ul pid.


Obs: Daca se vrea trimiterea unui semnal cu handler implicit nu este nevoie de signal. Este suficient kill catre procesul in
care se vrea trimiterea semnalului.
Prin signal noi nu trasmitem un semnal ci doar definim regulile. De ex: la rosu la semafor rutina de tratare este sa oprim.

Sigaction era utilizat in locul lui signal pentru ca pe compilatoarele vechi daca in timpul rularii unui handler aparea din nou
un semnal inainte de refacerea legaturii, pentru semnalul initial se revenea la rutina implicita.

Prin s.sa_handler anuntam noua rutina de tratare a semnalului specificat.

Structura sigaction s.sa_mask - contine semnale blocate pe perioada executarii handlerului.

sigaction(SIGUSR1,&s,NULL) - defineste comportamentul

sigprocmask - se foloseste pentru a modifica lista semnalelor blocate.

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