SIGACTION(2)

JMÉNO
sigaction, sigprocmask, sigpending, sigsuspend - Funkce POSIXu pro práci se signály.

SYNTAXE
#include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

int sigpending(sigset_t *set);

int sigsuspend(const sigset_t *mask);

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 nainstalována 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);
    }

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.

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 nebo SA_NOMASK .

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

    SA_ONESHOT nebo SA_RESETHAND
        Poté, co je zavolána obslužná funkce, se obsluha signálu vrací do implicitního stavu. (Takto se normálně chová systémové volání signal(2) .)

    SA_RESTART
        Nastaví kompatibilní chování s BSD: určitá systémová volání pak jsou po zpracování signálu restartována.

    SA_NOMASK neboli SA_NODEFER
        Umožní příchod dalšího signálu během jeho vlastní obslužné funkce.

Pole sa_restorer je neaktuální a nemělo by být používáno.

Systémovým voláním sigprocmask lze měnit seznam momentálně blokovaných signálů. Záleží na parametru how, jaká změna nastane:

    SIG_BLOCK
        Nový seznam blokovaných signálů bude obsahovat dosud blokované signály a signály v parametru set .

    SIG_UNBLOCK
        Signály v parametru set jsou odstraněny ze seznamu blokovaných signálů. Je přípustné uvést v parametru set signál, který není blokován.

    SIG_SETMASK
        Seznam blokovaných signálů je nastaven na set.

Je-li hodnota parametru oldset nenulová, je předchozí seznam blokovaných signálů uložen do oldset.

Systémové volání sigpending dovoluje zjistit nevyřízené signály (které přišly při zablokování). Maska nevyřízených signálů je uložena do parametru set.

Volání sigsuspend přechodně nahradí masku signálů maskou zadanou v parametru mask a poté pozdrží provádění procesu do obdržení signálu.

NÁVRATOVÉ HODNOTY
Funkce sigaction, sigprocmask, sigpending a sigsuspend vrací 0 při úspěšném provedení a -1 při chybě.

CHYBOVÉ HODNOTY

EINVAL
    Byl zadán neplatný signál. Tato chyba je také generována při pokusu změnit obsluhu signálů SIGKILL nebo SIGSTOP, které nemohou být zachyceny.

EFAULT
    act, oldact, set nebo oldset ukazují do oblasti paměti, která nepatří do adresního prostoru procesu.

EINTR
    Systémové volání bylo přerušeno.

POZNÁMKY
Signály SIGKILL or SIGSTOP nelze blokovat voláním sigprocmask. Pokusy o to budou v tichosti ignorovány.

Podle normy POSIX není definováno chování procesu poté, co ignoruje signál SIGFPE, SIGILL, nebo SIGSEGV, který nebyl generován funkcemi kill() nebo raise(). Celočíselné dělení nulou dává nedefinovaný výsledek a na některých architekturách generuje signál SIGFPE. Ignorování tohoto signálu může způsobit zacyklení procesu.

Nastavení akce pro signál SIGCHLD na SIG_IGN způsobí automatický zánik dětských procesů po jejich ukončení.

Norma POSIX definuje pouze příznak SA_NOCLDSTOP. Používání jiných příznaků v sa_flags je nepřenositelné.

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

Jména SA_RESETHAND and SA_NODEFER jsou určena pro kompatibilitu se SVr4 a byla zavedena ve verzi knihovny libc 3.0.9.

Pro zjištění momentálního stavu obsluhy signálů lze volat funkci sigaction s parametrem act rovným nule. Zadáte-li nulové parametry act a oldact, lze ji použít ke kontrole, je-li daný signál na tom kterém systému použitelný.

Pro podrobnosti o manipulaci se skupinami signálů viz sigsetops(3)

SPLŇUJE STANDARDY
POSIX, SVr4. Dokumentace SVr4 se nezmiňuje o chybové hodnotě EINTR.

DALŠÍ INFORMACE
kill(1), kill(2), killpg(2), pause(2), raise(3), siginterrupt(3), signal(2), signal(7), sigsetops(3), sigvec(2)