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 .
Signály se vysílají:
Signály nelze odeslat ukončenému procesu, který je ve stavu zombie .
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.
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.
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.
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:
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“ |
Meziprocesová komunikace | |
---|---|
Metody | |
Vybrané protokoly a standardy |