> Linux Reviews > man >

signal

signal

obsługa sygnałów ANSI C


  1. signal.2.man
  2. signal.7.man


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 C  

SKŁ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 C

 

ZOBACZ TAKŻE

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


 

Index

NAZWA
SKŁADNIA
OPIS
WARTOŚĆ ZWRACANA
PRZENOŚNOŚĆ
UWAGI
ZGODNE Z
ZOBACZ TAKŻE

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łów  

OPIS

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śćAkcjaKomentarz




lub śmierć procesu kontrolującego
SIGINT 2TermPrzerwanie nakazane z klawiatury
SIGQUIT 3CoreWyjście nakazane z klawiatury
SIGILL 4CoreNielegalna instrukcja
SIGABRT 6CoreSygnał abort od abort(3)
SIGFPE 8CoreWyjątek zmiennoprzecinkowy
SIGKILL 9TermSygnał Kill
SIGSEGV11CoreNieprawidłowa referencja pamięciowa
SIGPIPE13TermUszkodzony potok: zapis do potoku bez odbiorców
SIGALRM14TermSygnał timera od alarm(2)
SIGTERM15TermSygnał zakończenia pracy
SIGUSR130,10,16TermSygnał 1 użytkownika
SIGUSR231,12,17TermSygnał 2 użytkownika
SIGCHLD20,17,18IgnPotomek zatrzymał się lub zakończył pracę
SIGCONT19,18,25ContKontynuuj, jeśli się zatrzymał
SIGSTOP17,19,23StopZatrzymaj proces
SIGTSTP18,20,24StopZatrzymanie napisane z tty
SIGTTIN21,21,26StopWejście tty dla procesu w tle
SIGTTOU22,22,27StopWyjś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śćAkcjaKomentarz




SIGPOLLTermZdarzenie odpytywalne (Sys V). Synonim SIGIO
SIGPROF27,27,29TermPrzeterminowanie zegara profilowego
SIGSYS12,-,12CoreNiewłaściwy argument funkcji (SVID)
SIGTRAP5CoreŚledzenie/pułapka kontrolna
SIGURG16,23,21IgnPilny warunek na gnieździe (BSD 4.2)
SIGVTALRM26,26,28TermWirtualny zegar alarmu (BSD 4.2)
SIGXCPU24,24,30CorePrzekroczone ograniczenie czasu CPU (BSD 4.2)
SIGXFSZ25,25,31CorePrzekroczone 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śćAkcjaKomentarz




SIGEMT7,-,7Term
SIGSTKFLT-,16,-TermBłąd stosu koprocesora (nieużywany)
SIGIO23,29,22TermI/O teraz możliwe (BSD 4.2)
SIGCLD-,-,18IgnSynonim SIGCHLD
SIGPWR29,30,19TermBłąd zasilania (System V)
SIGINFO29,-,-Synonim SIGPWR
SIGLOST-,-,-TermUtracono blokadę pliku
SIGWINCH28,28,20IgnSygnał zmiany rozmiarów okna (BSD 4.3, Sun)
SIGUNUSED-,31,-TermNie 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.1  

BŁĘ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

NAZWA
OPIS
Zachowania sygnału
Maska sygnału i sygnały oczekujące
Sygnały standardowe
Sygnały czasu rzeczywistego
ZGODNE Z
BŁĘDY
ZOBACZ TAKŻE

This document was created by man2html using the manual pages.
Time: 00:25:15 GMT, November 20, 2008

SVENSKA - SVENSKA - SVENSKA - SVENSKA - nl