signal
obsługa sygnałów ANSI C
1. signal.2.man
Manpage of SIGNAL
SIGNAL
Section: Podręcznik programisty Linuksa (2)Updated: 2000-04-28
Index Return to Main Contents
NAZWA
signal - obsługa sygnałów ANSI CSKŁADNIA
#include <signal.h>typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
OPIS
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 CZOBACZ TAKŻE
kill(1), kill(2), killpg(2), pause(2), raise(3), sigaction(2), signal(7), sigsetops(3), sigvec(2), alarm(2)
Index
This document was created by man2html using the manual pages.
Time: 00:25:14 GMT, November 20, 2008
2. signal.7.man
Manpage of SIGNAL
SIGNAL
Section: Podręcznik programisty Linuksa (7)Updated: 2002-06-13
Index Return to Main Contents
NAZWA
signal - lista dostępnych sygnałówOPIS
Linux wspiera zarówno rzeczywiste sygnały POSIX-owe (zwane dalej "sygnałami standardowymi"), jak i sygnały POSIX-owe czasu rzeczywistego.Zachowania sygnału
Każdy sygnał ma przypisane bieżące zachowanie, które określa reakcję procesu na dostarczony sygnał.Wpisy w kolumnie "Akcja" tabeli określają domyślne zachowanie dla danego sygnału, jako jedno z następujących:
- Term
- Domyślną akcją jest przerwanie procesu.
- Ign
- Domyślną akcją jest zignorowanie sygnału.
- Core
- Domyślną akcją jest przerwanie procesu i zapisanie obrazu pamięci (patrz core(5)).
- Stop
- Domyślną akcją jest zatrzymanie procesu.
- Cont
- Domyślną akcją jest kontynuowanie procesu, jeżeli jest obecnie zatrzymany.
Proces może zmienić zachowanie się sygnału, używając sigaction(2) lub (mniej przenośnego) signal(2). Używając tych wywołań systemowych, proces może wybrać jedną z poniższych reakcji na dostarczenie sygnału: wykonać domyślną akcję, zignorować sygnał, przejąć sygnał wykonując akcję obsługi sygnału, czyli podaną przez programistę funkcję, wywoływaną automatycznie po dostarczeniu sygnału.
Zachowanie sygnału jest atrybutem poszczególnych procesów: w aplikacji wielowątkowej zachowanie danego sygnału jest takie samo dla wszystkich wątków.
Maska sygnału i sygnały oczekujące
Sygnał może być zablokowany, co oznacza, że nie zostanie dostarczony, dopóki się go nie odblokuje. Sygnał jest nazywany oczekującym, jeżeli został już wygenerowany, ale nie został jeszcze dostarczony.Każdy wątek procesu ma swoją niezależną maskę sygnałów, określającą zbiór sygnałów obecnie blokowanych przez wątek. Wątek może zmieniać maskę sygnałów, używając pthread_sigmask(3). Tradycyjna, jednowątkowa aplikacja może do tego celu użyć sigprocmask(2).
Sygnał może być wygenerowany (i w związku z tym oczekujący) dla procesu jako całości (np. wysłany za pomocą kill(2)) lub dla określonego wątku (np. skierowane do wątku są niektóre sygnały, takie jak SIGSEGV lub SIGPFPE, generowane w konsekwencji użycia określonej instrukcji języka maszynowego oraz sygnały wysłane za pomocą pthread_kill(2)). Sygnał skierowany do procesu może być dostarczony do któregokolwiek z jego wątków, który nie blokuje tego sygnału. Jeżeli więcej niż jeden wątek nie blokuje sygnału, to jądro dostarczy sygnał do przypadkowo wybranego wątku.
Wątek może pobrać zbiór obecnie oczekujących sygnałów, używając sigpending(2). Zbiór ten będzie zawierał sygnały oczekujące skierowane zarówno do całego procesu, jak i do wywołującego wątku.
Sygnały standardowe
Linux wspiera wymienione poniżej sygnały standardowe. Numery niektórych sygnałów zależą od architektury, co pokazano w kolumnie "Wartość". (Jeżeli podano trzy wartości, to zazwyczaj pierwsza obowiązuje dla architektur alpha i sparc, środkowa dla i386, ppc i sh, a ostatnia dla mips. Znak - oznacza, że sygnał dla danej architektury nie występuje.)Najpierw sygnały opisane w pierwotnym standardzie POSIX.1.
| Sygnał | Wartość | Akcja | Komentarz |
| lub śmierć procesu kontrolującego | |||
| SIGINT | 2 | Term | Przerwanie nakazane z klawiatury |
| SIGQUIT | 3 | Core | Wyjście nakazane z klawiatury |
| SIGILL | 4 | Core | Nielegalna instrukcja |
| SIGABRT | 6 | Core | Sygnał abort od abort(3) |
| SIGFPE | 8 | Core | Wyjątek zmiennoprzecinkowy |
| SIGKILL | 9 | Term | Sygnał Kill |
| SIGSEGV | 11 | Core | Nieprawidłowa referencja pamięciowa |
| SIGPIPE | 13 | Term | Uszkodzony potok: zapis do potoku bez odbiorców |
| SIGALRM | 14 | Term | Sygnał timera od alarm(2) |
| SIGTERM | 15 | Term | Sygnał zakończenia pracy |
| SIGUSR1 | 30,10,16 | Term | Sygnał 1 użytkownika |
| SIGUSR2 | 31,12,17 | Term | Sygnał 2 użytkownika |
| SIGCHLD | 20,17,18 | Ign | Potomek zatrzymał się lub zakończył pracę |
| SIGCONT | 19,18,25 | Cont | Kontynuuj, jeśli się zatrzymał |
| SIGSTOP | 17,19,23 | Stop | Zatrzymaj proces |
| SIGTSTP | 18,20,24 | Stop | Zatrzymanie napisane z tty |
| SIGTTIN | 21,21,26 | Stop | Wejście tty dla procesu w tle |
| SIGTTOU | 22,22,27 | Stop | Wyjście tty dla procesu w tle |
Sygnałów SIGKILL oraz SIGSTOP nie można przechwycić, zablokować ani zignorować.
Następnie sygnały nie występujące w standardzie POSIX.1, ale opisane w SUSv2 lub w SUSv3 / POSIX 1003.1-2001.
| Sygnał | Wartość | Akcja | Komentarz |
| SIGPOLL | Term | Zdarzenie odpytywalne (Sys V). Synonim SIGIO | |
| SIGPROF | 27,27,29 | Term | Przeterminowanie zegara profilowego |
| SIGSYS | 12,-,12 | Core | Niewłaściwy argument funkcji (SVID) |
| SIGTRAP | 5 | Core | Śledzenie/pułapka kontrolna |
| SIGURG | 16,23,21 | Ign | Pilny warunek na gnieździe (BSD 4.2) |
| SIGVTALRM | 26,26,28 | Term | Wirtualny zegar alarmu (BSD 4.2) |
| SIGXCPU | 24,24,30 | Core | Przekroczone ograniczenie czasu CPU (BSD 4.2) |
| SIGXFSZ | 25,25,31 | Core | Przekroczone ograniczenie rozmiaru pliku (BSD 4.2) |
Do wersji 2.2 Linuksa (włącznie) domyślne zachowanie dla sygnałów SIGSYS, SIGXCPU, SIGXFSZ oraz (na architekturach innych niż SPARC i MIPS) SIGBUS polegało na przerwaniu procesu (bez zrzutu pamięci). (W niektórych innych Uniksach domyślne zachowanie dla SIGXCPU i SIGXFSZ polega na przerwaniu procesu bez zrzutu pamięci). Linux 2.4 jest zgodny ze wymaganiami standardu POSIX 1003.1-2001 w zakresie przerywania procesu ze zrzutem pamięci.
A teraz różne inne sygnały.
| Sygnał | Wartość | Akcja | Komentarz |
| SIGEMT | 7,-,7 | Term | |
| SIGSTKFLT | -,16,- | Term | Błąd stosu koprocesora (nieużywany) |
| SIGIO | 23,29,22 | Term | I/O teraz możliwe (BSD 4.2) |
| SIGCLD | -,-,18 | Ign | Synonim SIGCHLD |
| SIGPWR | 29,30,19 | Term | Błąd zasilania (System V) |
| SIGINFO | 29,-,- | Synonim SIGPWR | |
| SIGLOST | -,-,- | Term | Utracono blokadę pliku |
| SIGWINCH | 28,28,20 | Ign | Sygnał zmiany rozmiarów okna (BSD 4.3, Sun) |
| SIGUNUSED | -,31,- | Term | Nie użyty sygnał (wystąpi SIGSYS) |
(Sygnał 29 oznacza SIGINFO / SIGPWR na architekturze alpha, lecz SIGLOST na architekturze sparc).
SIGEMT nie jest wymieniony w POSIX 1003.1-2001, lecz pomimo to pojawia się w większości innych Uniksów. Domyślną akcją dla tego sygnału jest zazwyczaj przerwanie procesu ze zrzutem pamięci.
SIGPWR (nie wymieniony w POSIX 1003.1-2001) jest zazwyczaj domyślnie ignorowany w tych Uniksach, w których występuje.
SIGIO (nie wymieniony w POSIX 1003.1-2001) jest domyślnie ignorowany w niektórych innych Uniksach.
Sygnały czasu rzeczywistego
Linux wspiera sygnały czasu rzeczywistego zdefiniowane pierwotnie w rozszerzeniu dla czasu rzeczywistego POSIX.4 (a obecnie zawarte w POSIX 1003.1-2001). Linux wspiera 32 sygnały czasu rzeczywistego, o numerach od 32 (SIGRTMIN) do 63 (SIGRTMAX). (Programy powinny zawsze odwoływać się do sygnałów czasu rzeczywistego używając notacji SIGRTMIN+n, gdyż zakres numerów sygnałów czasu rzeczywistego różni się pomiędzy Uniksami).W odróżnieniu od sygnałów standardowych, sygnały czasu rzeczywistego nie posiadają predefiniowanego znaczenia: można wykorzystywać cały zestaw sygnałów czasu rzeczywistego do celów określonych w aplikacji. (Należy jednak zauważyć, że implementacja LinuxThreads korzysta z trzech pierwszych sygnałów czasu rzeczywistego).
Domyślą akcją na nieobsłużony sygnał czasu rzeczywistego jest przerwanie procesu, który go otrzymał.
Sygnały czasu rzeczywistego są rozpoznawane w następujący sposób:
- 1.
- Można kolejkować wiele egzemplarzy sygnału czasu rzeczywistego. Dla odróżnienia, jeśli w czasie gdy standardowy sygnał jest blokowany zostanie doręczonych wiele egzemplarzy tego sygnału, tylko jeden egzemplarzy trafia do kolejki.
- 2.
- Jeśli sygnał wysłano korzystając z sigqueue(2), można wysłać wraz z tym sygnałem wartość towarzyszącą (całkowitą lub wskaźnik). Jeśli proces otrzymujący ustanawia funkcję obsługi dla tego sygnału za pomocą znacznika SA_SIGACTION funkcji sigaction(2), to otrzymuje towarzyszącą mu daną za pośrednictwem pola si_value struktury siginfo_t przekazanej jako drugi argument funkcji obsługi. Ponadto, pola si_pid oraz si_uid tej struktury mogą służyć do otrzymania PID oraz rzeczywistego ID użytkownika procesu wysyłającego sygnał.
- 3.
- Sygnały czasu rzeczywistego są doręczane w zagwarantowanej kolejności. Sygnały czasu rzeczywistego jednego rodzaju są doręczane w takiej kolejności, w jakiej zostały wysłane. Jeśli do procesu zostaną wysłane różne sygnały czasu rzeczywistego, będą one doręczone począwszy od sygnału o najniższym numerze. (Tzn. sygnały o niskich numerach mają najwyższy priorytet).
POSIX nie określa, które z sygnałów powinny zostać doręczone jako pierwsze w sytuacji, gdy obsłużenia wymagają zarówno sygnały standardowe, jak i sygnały czasu rzeczywistego. Linux, podobnie do innych implementacji, daje w tym przypadku pierwszeństwo sygnałom standardowym.
Zgodnie z POSIX, implementacja powinna zezwalać na kolejkowanie do procesu co najmniej _POSIX_SIGQUEUE_MAX (32) sygnałów czasu rzeczywistego. Jednakże, Linux zamiast określać ograniczenie dla procesu, wymusza ograniczenie ogólnosystemowe liczby kolejkowanych do wszystkich procesów sygnałów czasu rzeczywistego. Ograniczenie to można zobaczyć, a także (przy odpowiednich uprawnieniach) zmienić za pośrednictwem pliku /proc/sys/kernel/rtsig-max. Podobnie, za pośrednictwem pliku /proc/sys/kernel/rtsig-nr można dowiedzieć się ile sygnałów czasu rzeczywistego jest aktualnie w kolejce. W Linuksie 2.6.8 ten interfejs /proc został zastąpiony limitem zasobów RLIMIT_SIGPENDING, który określa limit kolejkowanych sygnałów dla poszczególnych użytkowników; patrz setrlimit(2) w celu uzyskania dalszych informacji.
ZGODNE Z
POSIX.1BŁĘDY
SIGIO i SIGLOST mają tę samą wartość. Ten drugi jest zakomentowany w źródłach jądra, lecz proces tworzenia niektórych aplikacji wciąż zakłada, że sygnał 29 to SIGLOST.ZOBACZ TAKŻE
kill(1), kill(2), killpg(2), setitimer(2), setrlimit(2), sigaction(2), signal(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsuspend(2), sigwaitinfo(2), raise(3), sigvec(3), sigset(3), strsignal(3), core(5), proc(5), pthreads(7)
Index
This document was created by man2html using the manual pages.
Time: 00:25:15 GMT, November 20, 2008



