Signál je událost, kterou generuje systém UNIX (Linux) jako odpověď na nějakou podmínku a po jehož přijetí může proces (skript) provést nějakou akci. Signály generují některé chybové podmínky, například porušení segmentů paměti, chyby procesoru v plovoucí čárce nebo neplatné instrukce. Jsou generovány shellem a ovladači terminálu, které vyvolají přerušení. Může je také jeden proces explicitně poslat druhému procesu a předat mu tak nějakou informaci, případně ovlivnit jeho chování. Ve všech těchto případech je programové rozhraní stejné. Signály mohou být generovány, odchytávány anebo (některé přinejmenším) ignorovány. Názvy signálů jsou definovány v hlavičkovém souboru signal.h
. Všechny začínají zkratkou "SIG". Výpis signálů systému Linux je uveden níže.
Ve vašich skriptech je možné použít zabudovaný program trap
, který dovede zachytávat signály ve vašem programu. Je to dobrá cesta, jak uhlazeně ukončit program. Například, máte-li spuštěný program, zmáčknutím kláves Ctrl-C pošlete aplikaci signál přerušení, který zlikviduje váš program. Příkaz trap
může zachytit signál a dát tak šanci programu v pokračování. Nebo se zeptá uživatele, jestli má skončit. trap
používá následující syntaxi:
trap akce signál
Kde akce je to, co bude vykonáno při doručení signálu aplikaci. Signál je název signálu, který bude-li doručen, tak se vykoná příslušná akce. Signály, které může aplikace dostat si můžete nechat například vypsat pomocí příkazu trap -l
. Používáte-li signály ve vašem skriptu, musíte vynechat první tři písmena jeho názvu (obvykle je to SIG). Například je-li signál SIGINT, bude do skriptu zapsáno pouze INT. Můžete také místo názvů signálů používat jejich čísla. Například číselná hodnota SIGINT je 2. Nyní vyzkoušejte následující program:
#!/bin/bash
trap sorry INT
sorry()
{
echo "Sorry, to jsem nechtěl!"
sleep 3
}
for i in 10 9 8 7 6 5 4 3 2 1; do
echo "$i sekund do selhání systému."
sleep 1
done
echo "Systém selhal!"
Nyní zkuste program spustit a zmáčknout Ctrl-C. To pošle skriptu signál SIGINT, který by měl přerušit program. Jelikož však signál bude zachycen a dojde ke zpracování funkce sorry(), která však program neukončí, takže bude běžet dál.
Chcete-li však, aby byl signál ignorován úplně, použijte jako akci "''
". Chcete-li pak někde v programu již standardní zpracování signálu, použijte jako akci "-
". Například:
# dojde-li signál, spustí funkci sorry()
trap sorry INT
# resetuje akci (nastavuje standardní chování SIGINT)
trap - INT
#nastavuje signál tak, aby byl ignorován
trap '' INT
Seznam signálů, které můžete v Linuxu použít (manuálová stránka signal z sekce 7 manuálových stránek):
SIGNAL(7) Linux - příručka Programátora SIGNAL(7) JMÉNO signal - seznam signálů POPIS V Linuxu jsou podporovány níže uvedené signály. Čísla některých signálů jsou závislá na architektuře. Nejprve jsou uvedeny signály popsané v normě POSIX.1. Signál Hodnota Akce Poznámka -------------------------------------------------------------------------- SIGHUP 1 A "Hangup" - při zavěšení na řídícím terminálu nebo ukončení řídícího procesu. SIGINT 2 A "Interrupt" - přerušení z klávesnice. SIGQUIT 3 A "Quit" - ukončení z klávesnice. SIGILL 4 A "Illegal Instruction" - neplatná instrukce. SIGABRT 6 C "Abort" - ukončení funkcí abort(3) SIGFPE 8 C "Floating point exception" - přetečení v pohyblivé řádové čárce. SIGKILL 9 AEF "Kill" - signál pro nepodmíněné ukončení procesu. SIGSEGV 11 C Odkaz na nepřípustnou adresu v paměti. SIGPIPE 13 A "Broken pipe" - pokus o zápis do roury, kterou nemá žádný proces otevřenou pro čtení. SIGALRM 14 A Signál od časovače, nastaveného funkcí alarm(1) SIGTERM 15 A "Termination" - signál ukončení SIGUSR1 30,10,16 A Signál 1 definovaný uživatelem SIGUSR2 31,12,17 A Signál 2 definovaný uživatelem SIGCHLD 20,17,18 B Zastavení nebo ukončení dětského procesu SIGCONT 19,18,25 Pokračování po zastavení SIGSTOP 17,19,23 DEF Zastavení procesu SIGTSTP 18,20,24 D Zastavení znakem "Stop" z terminálu SIGTTIN 21,21,26 D čtení z terminálu v procesu běžícím na pozadí SIGTTOU 22,22,27 D zápis na terminál v procesu běžícím na pozadí Následují ostatní signály: Signál Hodnota Akce Poznámka -------------------------------------------------------------------------- SIGTRAP 5 CG Přerušení při ladění (trasování,breakpoint) SIGIOT 6 CG IOT - synonymum signálu SIGABRT SIGEMT 7,-,7 G SIGBUS 10,7,10 AG "Bus error" - pokus o přístup mimo mapovanou paměť SIGSYS 12,-,12 G Nepřípustný parametr syst. volání (SVID) SIGSTKFLT -,16,- AG Chyba zásobníku koprocesoru SIGURG 16,23,21 BG Soket přijal data s příznakem Urgent (4.2 BSD) SIGIO 23,29,22 AG Lze pokračovat ve vstupu/výstupu (4.2 BSD) SIGPOLL AG Synonymum SIGIO (Systém V) SIGCLD -,-,18 G Synonymum SIGCHLD SIGXCPU 24,24,30 AG Překročen limit času CPU (4.2 BSD) SIGXFSZ 25,25,31 AG Překročen limit velikosti souboru (4.2 BSD) SIGVTALRM 26,26,28 AG Virtuální časovač (4.2 BSD) SIGPROF 27,27,29 AG Časovač používaný při profilování SIGPWR 29,30,19 AG Výpadek napájení (Systém V) SIGINFO 29,-,- G Synonymum SIGPWR SIGLOST -,-,- AG Zámek souboru byl ztracen SIGWINCH 28,28,20 BG Změna velikosti okna (4.3 BSD, Sun) SIGUNUSED -,31,- AG Nepoužívaný signál (Znak - ve sloupci "Hodnota" znamená, že se signál na dané architektuře nepoužívá. Jsou-li uvedeny tři hodnoty, první je obvykle použita na procesorech Alpha a Sparc, druhá na i386 a PowerPC a poslední na procesorech MIPS. Výjimkou je signál č. 29, který na procesorech Alpha znamená SIGINFO / SIGPWE, ale na Sparcu SIGLOST.) Příznaky ve sloupci "Akce" mají následující význam: A Tento signál standardně ukončí proces. B Tento signál je standardně ignorován. C Tento signál standardně způsobí výpis paměti pro cesu (core dump). D Tento signál standardně pozastaví provádění pro cesu. E Tento signál nemůže být zachycen. F Tento signál nemůže být ignorován. G Tento signál není definován normou POSIX.1. POZNÁMKA K PŘEKLADU U často se vyskytujících signálů byly ponechány ve sloupci "Poznámka" i původní termíny. Snáze se pak z hlášení shellu o ukončení procesu lokalizuje, kterým signálem byl proces přerušen. SPLŇUJE STANDARDY POSIX.1 CHYBY Signály SIGIO a SIGLOST mají stejnou hodnotu. SIGLOST se ve zdrojových textech jádra již nepoužívá, ale při překladu určitých balíků software se stále předpokládá, že signál č.29 znamená SIGLOST. DALŠÍ INFORMACE kill(1), kill(2), setitimer(2). Linux 1.3.88 4. března 1997 1