PředchozíNahoruDalšíObsah

9. Zachytávání signálů

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

PředchozíNahoruDalšíObsah

11. dubna 2001 17:06