Scroll to navigation

SIGACTION(2) Podręcznik programisty Linuksa SIGACTION(2)

NAZWA

sigaction, sigprocmask, sigpending, sigsuspend - POSIX-owe funkcje obsługi sygnałów.

SKŁADNIA

#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);

OPIS

Wywołanie systemowe sigaction jest używane do zmieniania akcji, którą obiera proces po odebraniu określonego sygnału.

signum określa sygnał i może być dowolnym prawidłowym sygnałem poza SIGKILL i SIGSTOP.

Jeśli act jest niezerowe, to nowa akcja dla sygnału signum jest brana z act. Jeśli oldact też jest niezerowe, to poprzednia akcja jest w nim zachowywana.

Struktura sigaction jest zdefiniowana jako

struct sigaction {

void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void); }

sa_handler podaje akcję, związaną z sygnałem signum i może to być m.in SIG_DFL dla akcji domyślnej, SIG_IGN dla akcji ignorowania, lub wskaźnik do funkcji obsługującej sygnał.

sa_mask podaje maskę sygnałów, które powinny być blokowane podczas wywoływania handlera sygnałów. Dodatkowo, sygnał, który wywołał handler będzie zablokowany, chyba że użyto flag SA_NODEFER lub SA_NOMASK.

sa_flags podaje zbiór flag, które modyfikują zachowanie procesu obsługi sygnałów. Jest to zbiór wartości połączonych bitowym OR:

Jeśli signum to SIGCHLD, nie odbieraj powiadomienia o zatrzymaniu procesu potomnego (np. gdy proces potomny otrzyma jeden z SIGSTOP, SIGTSTP, SIGTTIN lub SIGTTOU).
Odtórz akcję sygnałową do stanu domyślnego po wywołaniu handlera sygnałów. (Jest to domyślne zachowanie dla wywołania signal(2).)
Daj zachowanie, kompatybilne z semantyką sygnałową BSD, czyniąc pewne wywołania systemowe odtwarzalnymi przez sygnały.
Nie chroń sygnałów od bycia odebranymi z ich własnego handlera.

Element sa_restorer jest przedawniony i nie powinno się go używać.

Wywołanie sigprocmask jest używane do zmieniania listy obecnie blokowanych sygnałów. Zachowanie tego wywołania jest zależne od wartości how, w sposó następujący

Zestaw blokowanych sygnałów jest unią bieżącego zbioru i argumentu set.
Sygnały w set są usuwane z bieżącego zestawu sygnałów blokowanych. Legalnym jest próbowanie odblokiwania nieblokowanych sygnałów.
Zestaw blokowanych sygnałów jest ustawiany na argument set.

Jeśli oldset jest niezerowy, to poprzednia wartość maski sygnału jest w nim zachowywana.

Wywołanie sigpending umożliwia testowanie zalegających sygnałów (tych, które zostały podniesione w momencie blokowania). Maska sygnałowa dla zalegających sygnałów jest zachowana w set.

Wywołanie sigsuspend tymczasowo podmienia maskę sygnałową procesu na tą, przekazaną jako mask i zawiesza proces aż do otrzymania sygnału.

WARTOŚĆ ZWRACANA

sigaction, sigprocmask, sigpending i sigsuspend zwracają 0 po sukcesie i -1 po błędzie.

BŁĘDY

Podano nieprawidłowy sygnał. Będzie to też generowane dla sygnałów SIGKILL lub SIGSTOP.
act, oldact, set lub oldset wskazują na pamięc poza przestrzenią adresową.
Wywołanie systemowe zostało przerwane.

UWAGI

Nie można zablokować sygnałów SIGKILL lub SIGSTOP . Próby takie zostaną zignorowane.

Zgodnie z POSIX, zachowanie procesu po po zignorowaniu SIGFPE, SIGILL i SIGSEGV, niegenerowanych przez kill() lub raise() jest niezdefiniowane. Dzielenie liczby całkowitej przez zero ma wynik niezdefiniowany. Na niektórych architekturach generuje sygnał SIGFPE. Ignorowanie go może prowadzić do nieskończonej pętli.

Ustawienie SIGCHLD na SIG_IGN daje automatyczne zbieranie plonów procesów potomnych.

Specyfikacja POSIX definiuje tylko SA_NOCLDSTOP. Użycie innych flag jest nieprzenośne.

Flaga SA_RESETHAND jest kompatybilna z podobną flagą z SVr4.

Flaga SA_NODEFER jest kompatybilna z podobną flagą z SVr4 dla jąder Linuksa 1.3.9 i nowszych.

Nazwy SA_RESETHAND i SA_NODEFER są kompatybilne z SVr4 i są dostępne tylko w wersjach bibliotek większych lub równych 3.0.9.

sigaction może być wywoływany z drugim argumentem o wartości null, powodując w ten sposób zapytanie bieżącego handlera sygnału. Może go też użyć do sprawdzenia, czy dany sygnał jest prawidłowy na obecnej maszynie. W tym celu należy dać zerowy zarówno drugi, jak i trzeci argument.

Zobacz sigsetops(3) dla szczegółów o operacjach na zbiorach sygnałów.

ZGODNE Z

POSIX, SVR4

ZOBACZ TAKŻE

kill(1), kill(2), killpg(2), pause(2), raise(3), siginterrupt(3), signal(2), signal(7), sigsetops(3), sigvec(2)

24 Sierpnia 1995 Linux 1.3