table of contents
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:
- SA_NOCLDSTOP
- Jeśli signum to SIGCHLD, nie odbieraj powiadomienia o zatrzymaniu procesu potomnego (np. gdy proces potomny otrzyma jeden z SIGSTOP, SIGTSTP, SIGTTIN lub SIGTTOU).
- SA_ONESHOT or SA_RESETHAND
- 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).)
- SA_RESTART
- Daj zachowanie, kompatybilne z semantyką sygnałową BSD, czyniąc pewne wywołania systemowe odtwarzalnymi przez sygnały.
- SA_NOMASK or SA_NODEFER
- 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
- SIG_BLOCK
- Zestaw blokowanych sygnałów jest unią bieżącego zbioru i argumentu set.
- SIG_UNBLOCK
- Sygnały w set są usuwane z bieżącego zestawu sygnałów blokowanych. Legalnym jest próbowanie odblokiwania nieblokowanych sygnałów.
- SIG_SETMASK
- 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¶
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 |