Scroll to navigation

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:

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.
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í.

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.
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.
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.
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).
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.

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

act nebo oldact ukazují do paměti, která není platnou součástí adresového prostoru procesu.

Byl specifikován neplatný signál. Tato chyba bude generována i v případě, že bude proveden pokus o změnu akce na příkaz SIGKILL nebo SIGSTOP. Tyto signály nemohou být zachyceny nebo ignorovány.

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