NAZWA¶
signal - obsługa sygnałów ANSI C
SKŁADNIA¶
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t
handler);
OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!
Funkcja systemowa
signal() instaluje nową obsługę
sygnału dla sygnału o numerze
signum. Obsługa
sygnału ustawiana jest na
sighandler, który może
być funkcją podaną przez użytkownika lub
SIG_IGN
albo
SIG_DFL.
Po przysłaniu sygnału o numerze
signum dzieje się, co
następuje. Jeśli obsługa odpowiedniego sygnału
została ustawiona na
SIG_IGN, to sygnał jest ignorowany.
Jeśli obsługa została ustawiona na
SIG_DFL, to
podejmowana jest domyślna akcja skojarzona z sygnałem (patrz
signal(7)). Ostatecznie, Jeśli jako obsługa sygnału
została ustawiona function
sighandler, to najpierw albo
obsługa sygnału jest inicjowana na SIG_DFL albo odbywa się
zależne od implementacji blokowanie sygnału, a następnie
wywoływana jest funkcja
sighandler z argumentem
signum.
Używanie funkcji obsługi sygnału jest nazywane
"przechwytywaniem sygnału". Sygnały
SIGKILL i
SIGSTOP nie mogą być ani przechwycone, ani zignorowane.
WARTOŚĆ ZWRACANA¶
Funkcja
signal() zwraca poprzednią wartość obsługi
sygnału, lub
SIG_ERR w przypadku błędu.
PRZENOŚNOŚĆ¶
Oryginalne uniksowe
signal() zainicjalizowałoby obsługę
sygnału na SIG_DFL i to samo robi System V (oraz jądro Linuksa i
libc4,5). Z drugiej strony, BSD nie inicjalizuje obsługi sygnału,
ale blokuje nowopojawiające się egzemplarze tego sygnału
podczas wywoływania funkcji obsługi. Biblioteka glibc2
naśladuje zachowanie BSD.
Jeśli w systemie opartym o libc5 zostanie włączone
<bsd/signal.h> zamiast
<signal.h>, to
signal
zostanie przedefiniowane jako
__bsd_signal i będzie miało
semantykę BSD. Nie jest to zalecane.
Jeśli w systemie opartym o glibc2 zdefiniowane zostanie makro testowania
cechy, takie jak
_XOPEN_SOURCE lub zostanie użyta osobna funkcja
sysv_signal, otrzyma się zachowanie klasyczne. Nie jest to
zalecane.
Próba zmiany semantyki tej funkcji za pomocą przedefiniowywania i
włączania plików nagłówkowych nie jest dobrym
pomysłem. Lepiej w ogóle unikać funkcji
signal i
posługiwać się zamiast niej
sigaction(2).
UWAGI¶
Zgodnie ze standardem POSIX, zachowanie procesu po zignorowaniu sygnału
SIGFPE,
SIGILL lub
SIGSEGV, który nie był
wygenerowany przez funkcję
kill(2) ani
raise(3), jest
niezdefiniowane. Dzielenie przez zero liczby całkowitej nie ma
określonego wyniku. Na niektórych architekturach generuje to
sygnał
SIGFPE. (Również dzielenie najmniejszej liczby
ujemnej przez -1 może spowodować wygenerowanie
SIGFPE.)
Ignorowanie tego sygnału może doprowadzić do pętli
nieskończonej.
Zgodnie ze standardem POSIX (3.3.1.3) nie jest określone, co sie stanie gdy
SIGCHLD zostanie ustawiony na
SIG_IGN. W tym miejscu zachowanie
BSD i SYSV różni się, powodując nie działanie na
Linuksie oprogramowania BSD, które ustawia akcję dla
SIGCHLD
na
SIG_IGN.
Użycie
sighandler_t jest rozszerzeniem GNU. Różne wersje
libc predefiniują ten typ; libc4 i libc5 definiują
SignalHandler, glibc definiuje
sig_t, a gdy zdefiniowane jest
_GNU_SOURCE, również
sighandler_t.
ZGODNE Z¶
ANSI C
ZOBACZ TAKŻE¶
kill(1),
kill(2),
killpg(2),
pause(2),
raise(3),
sigaction(2),
signal(7),
sigsetops(3),
sigvec(2),
alarm(2)
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 2 signal
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.