table of contents
        
      
      
    | SIGACTION(2) | Linux - příručka programátora | SIGACTION(2) | 
JMÉNO¶
sigaction - prověří a změní akci signálu
SYNTAXE¶
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
Vyžaduje Feature Test Makro pro glibc (viz
    feature_test_macros(7)):
  
sigaction(): _POSIX_C_SOURCE>=1 || _XOPEN_SOURCE || _POSIX_SOURCE
POPIS¶
Systémovým voláním sigaction se určuje, jakou akci má proces provést při obdržení určitého signálu.
Parametrem signum je určen signál a lze zadat kterýkoli platný signál kromě SIGKILL a SIGSTOP.
Je-li hodnota act nenulová, je pro signál signum nainstalovaná akce act. Je-li hodnota oldact nenulová, předchozí akce je uložena do oldact.
Struktura sigaction je definována jako
struct sigaction {
    void (*sa_handler)(int);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
}
Na některých architekturách je zahrnuto sjednocení: nepřiřazujte do sa_handler a sa_sigaction.
Prvek sa_restorer je zastaralý a neměl by být používán. Norma POSIX nespecifikuje prvek sa_restorer.
sa_handler určuje akci, která má být přiřazena signálu signum a může obsahovat SIG_DFL pro implicitní akci, SIG_IGN pro ignorování signálu, nebo ukazatel na funkci ošetřující signál. Tato funkce má ošetřující funkci jako jediný parametr.
Pokud je v sa_flags specifikováno SA_SIGINFO, pak je obslužná funkce pro signum specifikována v sa_sigaction a ne v sa_handler. Tato funkce obdrží číslo signálu jako první parametr, ukazatel na siginfo_t jako druhý parametr a ukazatel na ucontext_t jako poslední třetí parametr. sa
sa_mask je maska signálů, které mají být zablokovány při obsluze signálu. Navíc je zablokován signál, který vyvolal akci, nejsou-li nastaveny příznaky SA_NODEFER .
sa_flags je množina příznaků, které ovlivňují obsluhu signálu. Je to logický součet následujících bitových konstant:
- SA_NOCLDSTOP
- Je-li signum SIGCHLD, negeneruje se signál při zastavení dětského procesu (tj. dostane-li tento proces signál SIGSTOP, SIGTSTP, SIGTTIN nebo SIGTTOU) nebo při ukončení (tj. při obdržení SIGCONT) (viz wait(2)). Toto nastavení má smysl pouze při zřízení obslužné funkce pro SIGCHLD.
- SA_NOCLDWAIT (Od Linuxu 2.6)
- Je-li signum rovno IGCHLD, nejsou z potomci procesu
      poté co skončí transformovány na zombie.
      Další informace také waitpid(2).
      Tento příznak má smysl pouze když je
      nastavena obslužná funkce pro SIGCHLD nebo je
      nastaveno SIG_DFL.
    Je-li příznak SA_NOCLDWAIT nastaven během zřizování obslužné funkce pro SIGCHLD, pak norma POSIX.1 nespecifikuje zda je signál SIGCHLD generován při ukončení potomka procesu. Na Linuxu je signál SIGCHLD v takovémto případě generován. V některých jiných implementacích však signál generován není. 
- SA_NODEFER
- Umožní příchod dalšího signálu během jeho vlastní obslužné funkce. Má smysl pouze pokud je nastavena obslužná funkce. SA_NOMASK je zastaralé a nestandardní synonymum.
- SA_ONSTACK
- Zavolá obslužnou funkci na alternativním signálovém zásobníku poskytnutého prostřednictvím sigaltstack(2). Pokud není alternativní zásobník dostupný, bude použit implicitní z zásobník. Toto nastavení je smysluplné pouze v případě, že je nastavena obslužná funkce.
- SA_RESETHAND
- Poté, co je zavolána obslužná funkce, se obsluha signálu vrací do implicitního stavu. Toto nastavení je smysluplné pouze v případě, že je nastavena obslužná funkce. SA_ONESHOT je zastaralé a nestandardní synonymum.
- SA_RESTART
- Nastaví kompatibilní chování s BSD: určitá systémová volání pak jsou po zpracování signálu restartována. Toto nastavení je smysluplné pouze v případě, že je nastavena obslužná funkce. Pro více informací o restartu systémového volání se obraťte na signal(7).
- SA_SIGINFO (Od Linuxu 2.2)
- Obslužná funkce má tři parametry, ne jeden. V tomto případě sa_sigaction by mělo být nastaveno místo sa_handler. Toto nastavení je smysluplné pouze v případě, že je nastavena obslužná funkce.
Parametr siginfo_t pro sa_sigaction je struktura s následujícími prvky:
siginfo_t {
   int      si_signo;       /*číslo signálu*/
   int      si_errno;       /*hodnota errno*/
   int      si_code;        /*kód signálu*/
   int      si_trapno;      /*číslo, které zapříčinilo hard-
                              warově generovaný signál (nepo-
                              užito na většině architektur)*/
   pid_t    si_pid;         /*ID odesílajícího procesu*/
   uid_t    si_uid;         /*skutečné ID vlastníka*/
   int      si_status;      /*návratová hodnota signálu*/
   clock_t  si_utime;       /*spotřeba uživatelského času*/
   clock_t  si_stime;       /*spotřeba systémového času*/
   sigval_t si_value;       /*hodnota signálu*/
   int      si_int;         /*POSIX.1b signál*/
   void    *si_ptr;         /*POSIX.1b signál*/
   int      si_overrun;     /*počítadlo časovače*/
   int      si_timerid;     /*ID časovače POSIX.1b*/
   void    *si_addr;        /*paměťová lokace, která
                              způsobila chybu*/
   int      si_band;        /*band event*/
   int      si_fd;          /*identifikátor souboru*/
}
Proměnné si_signo, si_errno a si_code jsou definována pro všechny signály. (si_errno se na Linuxu většinou nepoužívá) Zbytek struktury může být union, takže by měla být čtena pouze pole, která mají význam pro daný signál:
* POSIX.1b signály a SIGCHLD nastavují si_pid a si_uid.
* POSIX.1b časovače (od Linux verze 2.6)
    nastavují si_overrun
  
   a si_timerid. Pole si_timerid je interní ID
    použité
  
   kernelem pro identifikaci časovače. Není to
    stejné číslo
  
   jako ID vracené funkcí timer_create(2).
* SIGCHLD použije si_status, si_utime a si_stime.
* Proměnné si_int a si_ptr jsou
    specifikována odesilatelem
  
   POSIX.1b signálu. Více detailů lze nalézt v
    sigqueue(2).
* SIGILL, SIGFPE, SIGSEGV a SIGBUS
    používají si_addr kam
  
   vloží adresu chyby. SIGPOLL používá
    si_band a si_fd.
si_code je hodnota (ne bitová maska) indikující který signál byl zaslán. Následující seznam ukazuje hodnoty, které mohou být umístěny v poli si_code společně s důvodem, proč byl signál generován.
- SI_USER kill(2) nebo raise(3)
- SI_KERNEL Signály zaslané kernelem.
- SI_QUEUE sigqueue(2)
- SI_TIMER vypršel POSIXový časovač
- SI_MESGQ změnil se stav POSIXové fronty zpráv
- 
    
 (Od Linuxu 2.6.6). Viz. mq_notify(3)
- SI_ASINCIO Dokončeno AIO.
- SI_SIGIO SIGIO zařazeno do fronty
- SI_TKILL tkill(2) nebo tgkill(2) (od Linuxu 2.4.19)
Následující hodnoty mohou být umístěny v si_code pro signál SIGILL:
Následující hodnoty mohou být umístěny v si_code pro signál SIGFPE:
Následující hodnoty mohou být umístěny v si_code pro signál SIGSEGV:
Následující hodnoty mohou být umístěny v si_code pro signál SIGBUS:
Následující hodnoty mohou být umístěny v si_code pro signál SIGTRAP:
Následující hodnoty mohou být umístěny v si_code pro signál SIGCHLD:
Následující hodnoty mohou být umístěny v si_code pro signál SIGPOLL:
NÁVRATOVÁ HODNOTA¶
sigaction() vrací 0 při úspěchu a -1 při chybě.
CHYBY¶
SPLŇUJE STANDARDY¶
POSIX.1-2004, SVr4.
POZNÁMKY¶
Podle normy POSIX je chování procesu nedefinované pokud ignoruje SIGFPE, SIGILL nebo SIGSEGV signály, které nebyly generované pomocí kill(2) nebo raise(3). Dělení nulou v pevné řádové čárce (integer) má nedefinovaný výsledek. Tato operace může na některých architekturách generovat SIGFPE signál. (Také dělení nejmenšího záporného čísla -1 může generovat SIGFPE. ) Ignorování tohoto signálu může skončit nekonečnou smyčkou.
POSIX.1-1990 neumožňovalo nastavení SIGCHLD na hodnotu SIG_IGN. POSIX.1-2001 toto nastavení umožňuje, takže ignorování SIGCHLD může být použito pro zamezení vytváření zombies (viz wait(2)). Nicméně starší BSD a System V aplikace se v chování na příkaz SIGCHLD liší a tak stále jediným přenositelným řešením, že se potomek nestane zombie, je odchytávání signálu SIGCHLD pomocí wait(2) nebo jiné podobné funkce.
Norma POSIX.1-1990 specifikovala pouze SA_NOCLDSTOP. Norma POSIX.1-2001 přidala SA_NOCLDWAIT, SA_RESETHAND, SA_NODEFER a SA_SIGINFO. Použití těchto hodnot v sa_flags může být hůře přenositelné na starší linuxové distribuce.
Příznak SA_RESETHAND je kompatibilní se stejnojmenným příznakem v systémech SVr4.
Příznak SA_NODEFER je kompatibilní se stejnojmenným příznakem v SVr4 ve verzích jádra 1.3.9 a vyšších. Ve starších verzích jádra linuxová implementace dovolovala přijetí libovolného signálu, nejen toho který byl instalován (což způsobovalo ignorování nastavení sa_mask ).
Pokud je funkce sigaction() volána s druhým argumentem rovným null, může být zjištěna aktuální obslužná funkce. Může být také zjištěno zda je daný signál podporován na na daném stroji pokud zavoláme tuto funkci s druhým a třetím argumentem rovným null.
Signály SIGKILL a SIGSTOP nemohou být blokovány (specifikováním v sa_mask). Takovéto pokusy budou ignorovány bez vypsání chyby.
Pro více informací o manipulaci s množinami signálů se obraťte na sigsetopts(3).
Pro seznam asynchronních signálově bezpečných funkcí, které mohou být bezpečně volány zevnitř obslužné funkce použijte signal(7).
Nezdokumentované
  
  Před uvedením SA_SIGINFO bylo možné
    získat dodatečné informace pomocí funkce
    sa_handler s druhým parametrem typu struct sigcontext.
    Pro více informací se obraťte na relevantní
    kernelové zdroje. Tato funkce je nyní již
    zastaralá.
CHYBY¶
V kenelech do verze 2.6.13 včetně, specifikace SA_NODEFER v sa_flags zabránila nejenom vymaskování signálu během provádění obslužné funkce, ale měla také účinek na signály specifikované v sa_mask. Tato chyba byla odstraněna v kernelu 2.6.14.
PŘÍKLAD¶
Viz mprotect(2).
DALŠÍ INFORMACE¶
kill(1), kill(2), killpg(2), pause(2), sigaltstack(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsuspend(2), wait(2), raise(3), siginterupt(3) , sigsetopts(3), sigvec(3), core(5), signal(7)
TIRÁ޶
Tato stránka je součástí projektu Linux man-pages. Popis projektu a informace o hlášení chyb najdete na http://www.kernel.org/doc/man-pages/.
| 29.října 2009 | Linux 1.3 |