Comunicatia dintre procese / Semnale
In Linux si Unix procesele comunica prin doua modalitati principale:
1 Pipes (conducte)
Procesele pot comunica prin canale speciale numite pipes. Un proces trimite informatie pe acest canal care va fi folosita de celalalt proces. Sincronizarea este posibila fiindca in momentul in care un proces doreste sa citeasca dintr-o conducta goala este blocat pana cand exista date disponibile.
Example: sort < numere.txt | head
Comanda sort ordoneaza fisierul numere.txt care reprezinta inputul sau. Outputul comenzii sort in loc sa fie redirectat catre standard output este conectat la o conducta (care exista doar pe durata executiei comenzilor) care transmite datele ca input comenzii head. Daca conducta "se umple", sort asteapta ca head sa folosesca si sa indeparteze informatia din conducta.
Procesele pot comunica si folosind conducte de tipul named pipes sau domain named sockets.
Nota
|
Exemplu de procese care folosesc sockets pentru comunicare:
Procesul server de e-mail comunica printr-un socket cu procesul antivirus si printr-un alt socket cu procesul care verifica daca un e-mail este spam. Astfel e-mailul este transmis prin socket intre aceste procese, fiecare actionand intr-un anumit mod.
|
2. Intreruperi software (Semnale)
O alta modalitate de comunicare dintre procese este prin semnale sau intreruperi software. Exista intreruperi software care pot fi ignorate de procese sau care nu pot fi ignorate.
Exista multe semnale in Unix (de ordinul sutelor).
Dintre acestea cateva mai importante sunt:
Signal Name
|
Number
|
Description
|
SIGHUP
|
1
|
Hangup (POSIX)
|
SIGINT
|
2
|
Terminal interrupt (ANSI) - CTRL + C
|
SIGQUIT
|
3
|
Terminal quit (POSIX)
|
SIGILL
|
4
|
Illegal instruction (ANSI)
|
SIGKILL
|
9
|
Kill(can't be caught or ignored) (POSIX)
|
SIGALRM
|
14
|
Alarm clock (POSIX)
|
SIGTERM
|
15
|
Termination (ANSI)
|
SIGCONT
|
18
|
Continue executing, if stopped (POSIX) (bg %jobid)
|
SIGSTOP
|
19
|
Stop executing(can't be caught or ignored) (POSIX)
|
SIGTTIN
|
21
|
Background process trying to read, from TTY (POSIX) - (Ctrl + Z)
|
SIGTTOU
|
22
|
Background process trying to write, to TTY (POSIX)
|
SIGIO
|
29
|
I/O now possible (4.2 BSD)
|
SIGPWR
|
30
|
Power failure restart (System V)
|
Procesele pot ignora, bloca sau "prinde" toate semnalele cu exceptia SIGSTOP si SIGKILL. Daca un process "prinde" un semnal inseamna ca include cod care va actiona corespunzator la primirea semnalului. Daca semnalul nu este "prins" de proces, kernelul va executa actiunea default.
Pentru a trimite un semnal in mod expres unui proces se foloseste comanda kill . Aceasta primeste ca argument PID-ul procesului si tipul de semnal pe care sa-l trimita (default trimite SIGTERM(15)). SIGTERM se numeste si soft-kill iar SIGKILL se numeste hard-kill. Un proces poate ignora semnalul 15 dar nu si semnalul 9. La primirea semnalului 15 (daca nu este ignorat) sau 9 procesul trebuie sa intre in starea terminated.
Nota
|
Trimiterea semnalului SIGKILL (9) lui init nu are niciun efect.
|
Comanda pkill primeste ca argument numele comenzii care ruleaza in procesul caruia ii va trimite semnalul.
Comanda killall se foloseste pentru a trimite semnale tuturor proceselor care ruleaza sub acelasi nume.
Diferenta intre pkill si killall este ca pkill primeste ca argument doar o parte din numele procesului, iar killall primeste ca argument intreg numele.
Pentru a specifica semnalul trimis se poate folosi codul numeric al semnalului sau numele acestuia.
Exemplu
|
#ps -ef | grep bash
root
|
13162
|
13158
|
0
|
11:59
|
pts/1
|
00:00:00
|
-bash
|
root
|
13403
|
13400
|
0
|
12:19
|
pts/2
|
00:00:00
|
-bash
|
#kill -15 13162
sau
#kill -SIGTERM 13162
sau
#pkill bash
sau
#killall bash
|
Aplicatii:
1) sa se trimita procesului reprezentat de comanda sleep 100 semnalul corespunzator combinatiei Ctrl+Z
2) sa se trimita procesului reprezentat de comanda sleep 50 semnalul corespunzator combinatiei Ctrl+C
Nota
|
Pidul unui proces care ruleaza poate fi aflat folosind comanda pidof. Exemplu: pidof init
|
Dostları ilə paylaş: |