Semnal - Comandamentul Linux / Unix

Linux suportă atât semnale de încredere POSIX (în continuare "semnale standard") cât și semnale POSIX în timp real.

Semnale standard

Linux acceptă semnalele standard enumerate mai jos. Câteva numere de semnale sunt dependente de arhitectură, așa cum se indică în coloana "Valoare". (În cazul în care sunt date trei valori, prima este de obicei valabilă pentru alfa și sparc, cea medie pentru i386, ppc și sh, iar ultima pentru mips.

A - indică absența unui semnal pe arhitectura corespunzătoare.)

Înregistrările din coloana "Acțiune" din tabel specifică acțiunea implicită pentru semnal, după cum urmează:

Termen

Acțiunea prestabilită este de a termina procesul.

Ign

Acțiunea prestabilită este ignorarea semnalului.

miez

Acțiunea prestabilită este de a termina procesul și de bază de bază.

Stop

Acțiunea prestabilită este oprirea procesului.

În primul rând semnalele descrise în standardul original POSIX.1.

Semnal Valoare Acțiune cometariu
sau decesul procesului de control
SIGINT 2 Termen Întrerupeți de la tastatură
SIGQUIT 3 miez Ieșiți de la tastatură
SIGILL 4 miez Instrucțiune ilegală
SIGABRT 6 miez Anularea semnalului de la anulare (3)
SIGFPE 8 miez Cu excepția punctului scurs
SIGKILL 9 Termen Semnalul de ucidere
SIGSEGV 11 miez Memorie nevalidă
SIGPIPE 13 Termen Teava întreruptă: scrieți în țeavă fără cititoare
SIGALRM 14 Termen Semnalul de temporizare din alarmă (2)
SIGTERM 15 Termen Semnalul de terminare
SIGUSR1 30,10,16 Termen Semnal definit de utilizator 1
SIGUSR2 31,12,17 Termen Semnal definit de utilizator 2
SIGCHLD 20,17,18 Ign Copilul sa oprit sau sa terminat
SIGCONT 19,18,25 Continuați dacă ați oprit
SIGSTOP 17,19,23 Stop Opriți procesul
SIGTSTP 18,20,24 Stop Opriți tastarea la tty
SIGTTIN 21,21,26 Stop tty pentru procesul de fundal
SIGTTOU 22,22,27 Stop tty pentru procesul de fundal

Semnalele SIGKILL și SIGSTOP nu pot fi prinse, blocate sau ignorate.

În continuare semnalele nu sunt în standardul POSIX.1, dar sunt descrise în SUSv2 și SUSv3 / POSIX 1003.1-2001.

Semnal Valoare Acțiune cometariu
SIGPOLL Termen Evenimentul pollabil (Sys V). Sinonim pentru SIGIO
SIGPROF 27,27,29 Termen Timerul de profil a expirat
SIGSYS 12, -, 12 miez Argument rău pentru rutină (SVID)
SIGTRAP 5 miez Capcana de urmărire / întrerupere
SIGURG 16,23,21 Ign Condiție urgentă la soclu (4.2 BSD)
SIGVTALRM 26,26,28 Termen Ceas cu alarmă virtuală (4.2 BSD)
SIGXCPU 24,24,30 miez Limita de timp CPU depășită (4.2 BSD)
SIGXFSZ 25,25,31 miez Limita de dimensiune a fișierului depășită (4.2 BSD)

Până la și inclusiv Linux 2.2, comportamentul implicit pentru SIGSYS , SIGXCPU , SIGXFSZ și (pe alte arhitecturi decât SPARC și MIPS) SIGBUS a fost de a termina procesul (fără o dumpă de bază). (La unele alte Unices, acțiunea implicită pentru SIGXCPU și SIGXFSZ este de a termina procesul fără o memorie de bază.) Linux 2.4 se conformează cerințelor POSIX 1003.1-2001 pentru aceste semnale, terminând procesul cu un dump de bază.

Următoarele alte semnale.

Semnal Valoare Acțiune cometariu
SIGEMT 7, -, 7 Termen
SIGSTKFLT -, 16, - Termen Eroare la stack pe coprocesor (neutilizată)
SIGIO 23,29,22 Termen I / O posibil acum (4.2 BSD)
SIGCLD -, -, 18 Ign Un sinonim pentru SIGCHLD
SIGPWR 29,30,19 Termen Eroare de alimentare (Sistemul V)
SIGINFO 29, -, - Un sinonim pentru SIGPWR
SIGLOST -, -, - Termen Blocarea fișierelor sa pierdut
SIGWINCH 28,28,20 Ign Semnal de redimensionare a ferestrei (4.3 BSD, Sun)
SIGUNUSED -, 31, - Termen Semnal neutilizat (va fi SIGSYS)

(Semnalul 29 este SIGINFO / SIGPWR pe un alfa, dar SIGLOST pe un sparc.)

SIGEMT nu este specificat în POSIX 1003.1-2001, dar nu apare niciodată în majoritatea celorlalte Unices, unde acțiunea implicită este, de obicei, de a termina procesul cu un dump de bază.

SIGPWR (care nu este specificat în POSIX 1003.1-2001) este, de obicei, ignorat în mod prestabilit pentru celelalte unități în care apare.

SIGIO (care nu este specificat în POSIX 1003.1-2001) este ignorat implicit în mai multe unități.

Semnale în timp real

Linux suportă semnale în timp real, așa cum a fost definit inițial în extensiile POSIX.4 în timp real (și acum incluse în POSIX 1003.1-2001). Linux suportă 32 de semnale în timp real, numerotate de la 32 ( SIGRTMIN ) la 63 ( SIGRTMAX ). (Programele ar trebui să se refere întotdeauna la semnalele în timp real, folosind notația SIGRTMIN + n, deoarece intervalul de numere de semnale în timp real variază între Unices.)

Spre deosebire de semnalele standard, semnalele în timp real nu au semnificații predefinite: întregul set de semnale în timp real poate fi utilizat în scopuri definite de aplicație. (Rețineți însă că implementarea LinuxThreads utilizează primele trei semnale în timp real.)

Acțiunea prestabilită pentru un semnal în timp real nefolosit este terminarea procesului de primire.

Semnalele în timp real se disting prin următoarele:

  1. Mai multe instanțe ale semnalelor în timp real pot fi plasate în coadă. Prin contrast, dacă sunt difuzate mai multe instanțe ale unui semnal standard în timp ce semnalul este blocat în prezent, atunci doar o instanță este în coada de așteptare.
  2. În cazul în care semnalul este trimis cu ajutorul semnalului (2), se poate trimite o valoare însoțitoare (fie un număr întreg sau un indicator) cu semnalul. Dacă procesul de recepție stabilește un handler pentru acest semnal utilizând semnalizatorul SA_SIGACTION pentru sigaction (2), atunci acesta poate obține aceste date prin câmpul si_value al structurii siginfo_t trecut ca al doilea argument pentru handler. În plus, câmpurile si_pid și si_uid ale acestei structuri pot fi folosite pentru a obține PID-ul și ID-ul real al utilizatorului al procesului de trimitere a semnalului.
  3. Semnalele în timp real sunt livrate într-o ordine garantată. Sunt transmise mai multe semnale în timp real de același tip în ordinea în care au fost trimise. Dacă sunt transmise diferite semnale în timp real unui proces, acestea sunt livrate începând cu semnalul cu cel mai mic număr. (De exemplu, semnalele cu număr redus au cea mai mare prioritate.)

Dacă se așteaptă semnale standard și în timp real pentru un proces, POSIX îl lasă nespecificat care este livrat mai întâi. Linux, ca multe alte implementări, acordă prioritate semnalelor standard în acest caz.

Potrivit POSIX, o implementare ar trebui să permită cel puțin _POSIX_SIGQUEUE_MAX (32) semnale în timp real să fie în coadă într-un proces. Cu toate acestea, în loc să plaseze o limită per proces, Linux impune o limită la nivel de sistem pentru numărul de semnale în timp real în coadă pentru toate procesele.

Această limită poate fi vizualizată (și cu privilegiu) modificată prin intermediul fișierului / proc / sys / kernel / rtsig-max . Un fișier asociat, / proc / sys / kernel / rtsig-max , poate fi folosit pentru a afla câte semnale în timp real sunt în coada curentă.

ÎN CONFORMITATE CU

POSIX.1

Important: Utilizați comanda om ( % man ) pentru a vedea cum se utilizează o comandă pe computerul dvs. particular.