Scroll to navigation

SIGVEC(2) Linux - příručka Programátora SIGVEC(2)

JMÉNO

sigvec, sigblock, sigsetmask, siggsetmask, sigmask - BSD signal API

SYNTAXE

#include <bsd/signal.h>

int sigvec(int sig, struct sigvec *vec, struct sigvec *ovec);

int sigmask(int signum);

int sigblock(int mask);

int sigsetmask(int mask);

int siggsetmask(void);

Vyžaduje Feature Test Macro pro glibc(viz feature_stest_macros(7)):

Všechny funkce výše: _BSD_SOURCE

POPIS

Toto funkce jsou poskytovány v glibc kvůli zpětné kompatibilitě. Některé programy totiž stále používají zastaralé BSD signal API. Toto API je však již zastaralé. Nové programy by měly používat POSIX signal API(sigaction (2), sigprocmask(2), etc.)

Funkce sigvec() nastavuje a0bo čte hodnotu signálu sig (stejně jako POSIXová funkce sigaction(2)). Pokud není hodnota vec NULL, pak ukazuje na sigvec strukturu, která obsahuje dispozice pro sig. Pokud ovec není NULL pak ukazuje na strukturu, kde bude uložena předchozí hodnota sig. Pro získání aktuální dispozice sig bez toho, aby jsme ji měnili, je třeba nastavit NULL pro vec a různé od NULL pro ovec.

Stav SIGKILL a SIGSOP nesmí být měněn.

Struktura sigvec má následující formu:

struct sigvec{
void (*sv_handler)(); /*stav signálu*/
int sv_mask; /*blokované signály*/
int sv_flags; /*příznaky*/
};

Pole sv_handler specifikuje stav obsluhy signálu a nabývá jedné z následujících hodnot: adresa obslužné funkce; nebo SIG_DFL značící, že signál je nastaven na implicitní hodnotu; nebo SIG_IGN což značí, že signál je ignorován.

Pokud sv_handler obsahuje adresu funkce, která slouží pro obsluhu signálu, pak sv_mask specifikuje sadu signálů, které budou blokovány během provádění obslužné funkce. Navíc signál, pro který je volána obslužná funkce, je blokován implicitně. Pokusy o blokování SIGKILL nebo SIGSTOP jsou tiše ignorovány.

Pokud sv_handler specifikuje adresu obslužné funkce signálu, pak pole sv_flags specifikuje příznaky kontrolující co se bude odehrávat v případě, že bude volána obslužná funkce. Toto pole může obsahovat jeden nebo více následujících příznaků:

V případě, že obsluha signálu přeruší blokující volání systému, pak při návratu z obsluhy signálu nebude volání systému restartováno: místo toho systémové volání skončí neúspěšně s návratovou hodnotou EINTR. Není-li tento příznak specifikován, jsou systémová volání implicitně restartována.
Nastaví stav signálu na implicitní hodnotu před zavolání obslužné funkce. Pokud není tento příznak specifikován, pak obslužná funkce zůstane etablována, dokud nebude explicitně odstraněna pozdějším voláním sigvec() nebo dokud proces neprovede execve(2).

Obsluha signálu je na alternativním signálovém zásobníku (v minulosti zřízeném pod BSD za použití zastaralé funkce sigstack(); POSIX náhradou za tuto funkci je sigaltstack(2)).

Funkce sigmask() vytvoří a vrátí "masku signálu" pro signum. Například můžeme inicializovat pole vec.sv_mask předané sigvec() následujícím kódem:


vec.sv_mask = sigmask(SIGQUIT) | sigpause(SIGABRT);
/* blokuj SIGQUIT a SIGABRT během
provádění obslužné funkce*/

Funkce sigblock() přidá signály v masce k signálům již obsaženým v masce procesu (stejně jako POSIX funkce sigprocmask(SIG_BLOCK)) a vrátí předchozí signálovou masku. Pokusy o blokování SIGKILL nebo SIGSTOP jsou tiše ignorovány.

Funkce sigsetmask() nastavuje nastaví masku signálů procesu na hodnotu danou v mask (stejně jako POSIX sigprocmask(SIG_SETMASK)) a vrátí předchozí signálovou masku.

Funkce siggetmask() vrátí aktuální signálovou masku procesu. Tato funkce je ekvivalentní sigblock(0).

NÁVRATOVÁ HODNOTA

Funkce sigvec() vrací hodnotu 0 při úspěchu; při chybě vrací hodnotu -1 a nastaví errno k indikaci typu chyby.

Funkce sigblock() a sigsetmask() vrací předchozí signálovou masku.

Funkce sigmask() vrací masku signálů pro signum.

CHYBY

Viz chyby pod sigaction(2) a sigprocmask(2).

SPLŇUJE STANDARDY

Všechny funkce byly v 4.3BSD vyjma siggetmask(), jejíž původ je nejasný. Tyto funkce jsou zastaralé, nepoužívejte je v nových programech.

POZNÁMKY

Na 4.3BSD poskytovala funkce signal() jasnou sémantiku(volání sigvec() s vec.sv_mask rovnu 0). Na System V, signal() bohužel neposkytuje jasnou sémantiku. Specifikace POSIX.1-2001 nechává aspekty funkce signal() nespecifikovány. Viz signal(2) pro více detailů.

Při čekání na signál jak BSD tak System V poskytují funkci pojmenovanou sigpause(3), ale tato funkce má na každém systému jiné parametry. Viz sigpause(3) pro více detailů.

DALŠÍ INFORMACE

kill(2), pause(2), sigaction(2), signal(2), sigprocmask(2) raise(2), sigpause(3), sigset(3), 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/.

17. září 2009 Linux 1.3