Zpracování signálu C. - C signal handling
C standardní knihovna |
---|
Obecná témata |
Různé záhlaví |
V C Standardní knihovna, zpracování signálu definuje, jak program zpracovává různé signály zatímco se provádí. Signál může hlásit nějaké výjimečné chování v rámci programu (jako dělení nulou ), nebo signál může hlásit nějakou asynchronní událost mimo program (jako někdo udeří interaktivní klíč pozornosti na klávesnici).
Standardní signály
Standard C definuje pouze 6 signálů. Všechny jsou definovány v signál.h
záhlaví (signál
záhlaví C ++ ):[1]
SIGABRT
- „přerušení“, neobvyklé ukončení.SIGFPE
- Floating pmast Exception.SIGILL
- „nelegální“, neplatná instrukce.SIGINT
- "přerušení", interaktivní žádost o pozornost zaslaná programu.SIGSEGV
- "segmentace protiiolace ", neplatný přístup do paměti.SIGTERM
- "ukončit", žádost o ukončení odeslána do programu.
Další signály mohou být specifikovány v signál.h
záhlaví implementací. Například Unix a Unixový operační systémy (např Linux ) definujte více než 15 dalších signálů; vidět Unixový signál.[2]
Ladění
SIGTRAP
pro účely ladění. Je to závislé na platformě a lze jej použít na Unix -jako operační systémy.
Zacházení
Signál lze generovat voláním vyzdvihnout()
nebo zabít()
systémová volání. vyzdvihnout()
vyšle signál aktuálnímu procesu, zabít()
pošle signál určitému procesu.
Obsluha signálu je a funkce který je vyvolán cílovým prostředím, když dojde k odpovídajícímu signálu. Cílové prostředí pozastaví provádění programu, dokud se obslužný program signálu nevrátí nebo nezavolá longjmp ()
.
Obslužné programy signálu mohou být nastaveny na signál()
nebo sigaction ()
. Chování signál()
byl v historii několikrát změněn a je nyní považován za zastaralý.[3] Je přenosný, pouze když se používá k nastavení dispozice signálu na SIG_DFL nebo SIG_IGN. Obslužné programy signálu lze zadat pro všechny signály kromě dvou (SIGKILL a SIGSTOP nelze chytit, zablokovat nebo ignorovat).
Pokud signál hlásí chybu v programu (a signál není asynchronní), může obsluhu signálu ukončit voláním přerušit()
, výstup()
nebo longjmp ()
.
Funkce
Funkce | Popis |
---|---|
vyzdvihnout | uměle vyvolá signál |
signál | nastavuje akci provedenou, když program obdrží konkrétní signál |
Příklad použití
#zahrnout <signal.h>#zahrnout <stdio.h>#zahrnout <stdlib.h>statický prázdnota catch_function(int signo) { uvádí(„Interaktivní signál pozornosti byl chycen.“);}int hlavní(prázdnota) { // Nastavit výše uvedenou funkci jako obsluhu signálu pro signál SIGINT: -li (signál(SIGINT, catch_function) == SIG_ERR) { fputs("Při nastavování obslužné rutiny signálu došlo k chybě.", stderr); vrátit se EXIT_FAILURE; } uvádí(„Zvyšování interaktivního signálu pozornosti.“); -li (vyzdvihnout(SIGINT) != 0) { fputs("Chyba při zvyšování signálu.", stderr); vrátit se EXIT_FAILURE; } uvádí(„Odchází.“); vrátit se EXIT_SUCCESS; // ukončení po zvednutí signálu}
Viz také
Reference
- ^ Specifikace ISO / IEC 9899: 1999 (PDF). p. 258, § 7.14 Zpracování signálu.
- ^ „Specifikace Open Group Base, vydání 6 - signal.h - signály“. Citováno 10. ledna 2012.
- ^ http://man7.org/linux/man-pages/man2/signal.2.html Stránka signálu (2)