Semnale de comunicare între procese

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 30 noiembrie 2020; verificările necesită 2 modificări .

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]

Tipuri de semnal

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ă.

  • dacă pid > 0, semnalul este trimis procesului cu id pid;
  • dacă pid = 0, semnalul este trimis tuturor proceselor din grupul căruia îi aparține procesul de trimitere;
  • dacă pid = −1 și procesul de trimitere nu este un proces rădăcină, atunci semnalul este trimis către toate procesele din sistem al căror ID de utilizator se potrivește cu ID-ul de utilizator efectiv al procesului de trimitere.
  • dacă pid = −1 și procesul de trimitere este un proces rădăcină, atunci semnalul este trimis către toate procesele din sistem, cu excepția proceselor de sistem (de obicei, toate cu excepția proceselor cu pid = 0 și pid = 1);
  • dacă pid < 0, dar nu −1, atunci semnalul este trimis tuturor proceselor din grupul al căror id este egal cu valoarea absolută a argumentului pid (dacă privilegiile permit);
  • dacă semnal = 0, atunci se efectuează o verificare a erorilor și nu este trimis niciun semnal. Acesta poate fi folosit pentru a verifica dacă argumentul pid este valid (dacă există un proces sau un grup de procese pe sistem cu un id care se potrivește).
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]

Instalarea propriilor manere de semnal

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); }

Sistem de operare pe care pot fi utilizate semnale

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.

Note

  1. 1 2 Arhitectura UNIX. Procese Capitolul 1. Introducere în sistemul de operare UNIX (link mort) . Preluat la 11 mai 2016. Arhivat din original la 5 iunie 2016. 
  2. Cursul 8: Mijloace de comunicare inter-proces . Preluat la 11 mai 2016. Arhivat din original la 2 iunie 2016.

Link -uri