Semnalele de comunicare între procese sunt mesaje pe care sistemul de operare le trimite unui proces sau un proces le trimite altuia. Din punctul de vedere al utilizatorului, atunci când un proces primește un semnal, se pare că a avut loc o excepție (întrerupere). Când procesul primește un semnal, execuția programului de proces este întreruptă, iar controlul este transferat la o subrutină (funcție) - handler-ul de semnal. După ce se execută manipulatorul de semnal, execuția programului întrerupt se reia din punctul în care a fost întrerupt. [1] [2]
Tipurile de semnale sunt specificate prin numere numerice, dar la programare, ele folosesc de obicei nume simbolice (constante) definite în fișierele includ sistem. Sistemul de operare oferă un număr mare de tipuri de semnale, dar cele mai multe dintre aceste tipuri sunt rezervate pentru scopuri de sistem - acestea sunt semnale pe care sistemul de operare le trimite unui proces. Cu toate acestea, există și semnale că procesele se pot schimba între ele.
În autoritatea utilizatorului, un proces poate semnala orice alt proces al cărui PID îl cunoaște utilizând apelul de sistem kill (în ciuda numelui formidabil, acest apel de sistem nu distruge neapărat procesul căruia i se adresează).
#include <sys/types.h> #include <semnal.h> int kill ( pid_t pid , int signal );Argumentul pid specifică procesul către care se trimite semnalul, iar argumentul semnal specifică ce semnal să se trimită.
Tipul semnalului | Descriere |
---|---|
SIGKILL | Acest semnal determină încheierea procesului care l-a primit. Acesta este singurul semnal care nu poate fi ignorat și pentru care nu puteți aloca un handler personalizat. |
SIGTERM | Acest semnal este o cerere de încheiere a procesului. Emiterea acestui semnal, de exemplu, include comanda (nu un apel de sistem!) kill. Procesul care a primit acest semnal ar trebui să iasă, dar procesul poate seta semnalul să fie ignorat sau îi poate atribui propriul handler. |
SIGCHLD | Acest semnal este trimis de sistem către procesul părinte atunci când oricare dintre procesele sale secundare se termină. Răspunsul implicit la acest semnal este ignorat. Procesului părinte nu trebuie să-i pese de gestionarea acestui semnal decât dacă dorește să-l folosească pentru a-și sincroniza execuția cu procesul copil. |
SIGALRM | Acest semnal este folosit pentru a număra intervalele de timp. Un proces poate seta un anumit interval de timp folosind apelurile de sistem de alarmă sau setitimer, iar după ce intervalul specificat a trecut, sistemul îi va trimite un semnal SIGALRM. |
SIGUSR1 și SIGUSR2 | Nu sunt rezervate atribuiri de sistem pentru aceste semnale. Procesele pot trimite aceste semnale unul altuia și le pot interpreta după cum consideră de cuviință. [unu] |
Pentru a configura un handler de semnal personalizat, pentru a-l anula sau pentru a seta un semnal care să fie ignorat, utilizați apelul de sistem de semnal.
# include <signal.h> void ( * semnal ( int sig , void ( * handler ) ( int ))) ( int );Parametrul sig este numărul semnalului a cărui procesare urmează să fie modificată. Parametrul handler descrie o nouă modalitate de a gestiona semnalul - poate fi un pointer către o funcție de gestionare a semnalului definită de utilizator, valoarea specială SIG_DFL (restaurează comportamentul implicit al procesului pe semnalul sig) sau valoarea specială SIG_IGN ( ignora semnalul de intrare).
Apelul de sistem returnează un pointer către vechiul mod de a gestiona semnalul, a cărui valoare poate fi folosită pentru a restabili modul vechi, dacă este necesar. Manipulatorul de semnal în proces are forma unei funcții cu un prototip:
void function_name(int sigtype);
Parametrul acestei funcții este tipul de semnal (același handler poate fi setat să gestioneze semnale de diferite tipuri).
Un exemplu de manipulare personalizată a semnalului SIGUSR1.
void *my_handler(int nsig) { codul funcției de gestionare a semnalului } int main() { (void) semnal(SIGUSR1, my_handler); }Semnalele pot fi utilizate pe toate sistemele Unix, cum ar fi BSD, FreeBSD, GNU etc.
În Windows există un analog mic, funcția de semnal () de la CRT, ale cărui semnale, de fapt, numai SIGINT poate fi folosit în scopul propus.