Signál (Unix)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 2. září 2018; kontroly vyžadují 6 úprav .

Signál v operačních systémech rodiny Unix  je asynchronní upozornění procesu na událost, jeden z hlavních způsobů interakce mezi procesy . Když je procesu odeslán signál, operační systém přeruší provádění procesu, a pokud má proces nainstalovaný vlastní obslužný program signálu , operační systém spustí tento obslužný program a předá mu informace o signálu, pokud proces nenastal. nainstaloval handler, pak se spustí výchozí handler.

Názvy signálů „SIG...“ jsou číselné konstanty ( definice makra v jazyce C ) s hodnotami definovanými v záhlaví souboru signal.h. Číselné hodnoty signálů se mohou lišit systém od systému, i když většina z nich má v různých systémech stejné hodnoty. Nástroj kill umožňuje zadat signál jako číslo nebo symbol.

Specifikace signálu je součástí standardů POSIX .

Odesílání signálů

Signály se vysílají:

Signály nelze odeslat ukončenému procesu, který je ve stavu zombie .

Zpracování signálu

Výchozí obslužný program pro většinu signálů proces ukončí. Pro alternativní zpracování všech signálů kromě SIGKILL a SIGSTOP může proces přiřadit vlastní handler nebo ignorovat jejich výskyt úpravou masky signálu . Jedinou výjimkou je proces s pid 1 ( init ), který má právo ignorovat nebo zpracovávat jakékoli signály, včetně KILL a STOP.

Zabezpečení

Proces (nebo uživatel shellu) se skutečným UID jiným než 0 ( UID superuživatele ) může posílat signály pouze procesům se stejným skutečným UID.

Klasifikace signálů

POSIX definuje 28 signálů, které lze klasifikovat následovně:

název Kód Výchozí akce Popis Typ
SIGABRT 6 Konec výpisem paměti Signál vyslaný funkcíabort() Řízení
SIGALRM čtrnáct Dokončení Signál vypršení nastaveného časualarm() Oznámení
SIGBUS deset Konec výpisem paměti Špatné zacházení s fyzickou pamětí Výjimka
SIGCHLD osmnáct Ignorováno Podřízený proces byl ukončen nebo zastaven Oznámení
SIGCONT 25 Pokračujte v provádění Obnovte dříve zastavený proces Řízení
SIGFPE osm Konec výpisem paměti Chybná aritmetická operace Výjimka
VZDYCHNOUT jeden Dokončení Uzavření terminálu Oznámení
SIGILL čtyři Konec výpisem paměti Neplatná instrukce procesoru Výjimka
SIGINT 2 Dokončení Přerušení signálu (Ctrl-C) z terminálu Řízení
SIGKILL 9 Dokončení Bezpodmínečné ukončení Řízení
SIGPIPE 13 Dokončení Zápis do přerušeného spojení (potrubí, zásuvka) Oznámení
SIGQUIT 3 Konec výpisem paměti Signál "Quit" z terminálu (Ctrl-\) Řízení
SIGSEGV jedenáct Konec výpisem paměti Porucha přístupu do paměti Výjimka
SIGSTOP 23 Zastavení procesu Zastavení procesu Řízení
SIGTERM patnáct Dokončení Signál ukončení (výchozí signál pro nástroj zabíjení) Řízení
SIGTSTP dvacet Zastavení procesu Stop signál z terminálu (Ctrl-Z). Řízení
SIGTTIN 26 Zastavení procesu Pokus o čtení z terminálu procesem na pozadí Řízení
SIGTTOU 27 Zastavení procesu Pokuste se zapsat do terminálu procesem na pozadí Řízení
SIGUSR1 16 Dokončení Uživatelský signál #1 Zvyk
SIGUSR2 17 Dokončení Uživatelský signál #2 Zvyk
SIGPOLL 22 Dokončení Událost byla sledovánapoll() Oznámení
SIGPROF 29 Dokončení Vypršení časovače profilování Ladění
SIGSYS 12 Konec výpisem paměti Špatné systémové volání Výjimka
SIGTRAP 5 Konec výpisem paměti Trace trap nebo breakpoint Ladění
SIGURG 21 Ignorováno Na zásuvce přijata naléhavá data Oznámení
SIGVTALRM 28 Dokončení Vypršení platnosti "virtuálního časovače" Oznámení
SIGXCPU třicet Konec výpisem paměti Proces překročil časový limit CPU Výjimka
SIGXFSZ 31 Konec výpisem paměti Proces překročil povolenou velikost souboru Výjimka

Existují také signály, které nejsou definovány v POSIX, ale jsou přítomny v některých operačních systémech.

Při zpracování výjimek a signálů ladění může proces zapsat soubor s výpisem paměti procesu ( obraz jádra ) do aktuálního adresáře před ukončením ,  pomocí kterého může ladicí program obnovit podmínky, za kterých k této výjimce došlo. Někdy (například u programů spuštěných jako root) se z bezpečnostních důvodů nevytvoří výpis paměti.

SA_SIGINFO

Obslužný program signálu obvykle přijímá pouze jeden argument, číslo signálu (to vám umožňuje použít stejnou funkci obslužného programu pro více signálů). sigaction()Pokud zadáte volbu SA_SIGINFO při nastavování obsluhy signálu (pomocí funkce ), budou obsluze předány další dva argumenty:

  1. ukazatel na strukturu siginfo_tobsahující:
    • bitová maska ​​dodatečných „signálních kódů“, které určují příčinu jejího výskytu;
    • ID procesu (PID), který vyslal signál;
    • killefektivní identifikátor uživatele (UID), pod kterým běží proces (například obslužný program ), který vyslal signál;
    • adresa instrukce, ve které došlo k výjimce;
    • atd.
  2. ukazatel na "kontext stroje" v době, kdy se signál objevil (se "zásobníkem signálů" - dodatečná data, která jsou do zásobníku vložena, když jsou volány některé signály výjimek).

Většina dalších kódů je specifická pro každý signál. Kódy společné pro všechny signály:

Kód Popis
SI_USER Signál odeslaný funkcí kill()(nebo utilitou kill)
SI_QUEUE Signál odeslaný funkcísigqueue()
SI_TIMER Signál je odeslán po čase nastaveném funkcítimer_settime()
SI_ASYNCIO Signál odeslaný po dokončení požadavku "asynchronního I/O".
SI_MESGQ Signál odeslán, když se zpráva objeví v prázdné „frontě zpráv Unix“

Odkazy