Provided by:
manpages-pl-dev_20060617-3_all 
NAZWA
sigaction - bada i zmienia akcj sygnalu
SK/LADNIA
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction
*oldact);
OPIS
Wywolanie systemowe sigaction() jest uywane do zmieniania akcji, ktor
obiera proces po odebraniu okrelonego sygnalu.
signum okrela sygnal i moe by dowolnym prawidlowym sygnalem poza
SIGKILL i SIGSTOP.
Jeli act jest niezerowe, to nowa akcja dla sygnalu signum jest brana z
act. Jeli oldact te jest niezerowe, to poprzednia akcja jest w nim
zachowywana.
Struktura sigaction jest zdefiniowana jako
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}
Na niektorych architekturach cz tej struktury moe by uni: nie naley
ustawia jednoczenie pol sa_handler oraz sa_sigaction.
Element sa_restorer jest przedawniony i nie powinno si go uywa. POSIX
nie definiuje tego elementu.
sa_handler podaje akcj, zwizan z sygnalem signum i moe to by m.in
SIG_DFL dla akcji domylnej, SIG_IGN dla akcji ignorowania lub wskanik
do funkcji obslugujcej sygnal. Funkcja ta ma jtylko eden argument, w
ktorym bdzie przekazany numer sygnalu.
Jeeli warto SA_SIGINFO jest podana w sa_flags, to sa_sigaction (zamiast
sa_handler) okrela funkcj obslugi sygnalu dla signum. Funkcja ta
otrzymuje numer sygnalu jako pierwszy argument, wskanik do siginfo_t
jako drugi argument oraz wskanik do ucontext_t (zrzutowany na void *)
jako jej trzeci argument.
sa_mask podaje mask sygnalow, ktore powinny by blokowane podczas
wywolywania handlera sygnalow. Dodatkowo, sygnal, ktory wywolal handler
bdzie zablokowany, chyba e uyto flagi SA_NODEFER.
sa_flags podaje zbior flag, ktore modyfikuj zachowanie procesu obslugi
sygnalow. Jest to zbior wartoci polczonych bitowym OR:
SA_NOCLDSTOP
Jeli signum to SIGCHLD, nie odbieraj powiadomienia o
zatrzymaniu procesu potomnego (np. gdy proces potomny
otrzyma jeden z SIGSTOP, SIGTSTP, SIGTTIN lub SIGTTOU)
lub o jego wznowieniu (np. po otrzymaniu SIGCONT) (patrz
wait(2)).
SA_NOCLDWAIT
(Linux 2.6 i kolejne) Jeeli signum to SIGCHLD, to procesy
potomne po ich zakoczeniu nie bd przeksztalcone w
procesy-duchy (zombie). Patrz take waitpid(2).
SA_RESETHAND
Odtworz akcj sygnalow do stanu domylnego po wywolaniu
handlera sygnalow. SA_ONESHOT jest przestarzalym,
niestandardowym synonimem tej flagi.
SA_ONSTACK
Wywolaj handler sygnalu, uywajc alternatywnego stosu
ustawionego przez sigaltstack(2). Jeeli ten alternatywny
stos nie jest dostpny, zostanie uyty stos domylny.
SA_RESTART
Daj zachowanie, kompatybilne z semantyk sygnalow BSD,
czynic pewne wywolania systemowe odtwarzalnymi przez
sygnaly.
SA_NODEFER
Nie chro sygnalow od bycia odebranymi z ich wlasnego
handlera.SA_NOMASK jest przestarzalym, niestandardowym
synonimem tej flagi.
SA_SIGINFO
Handler sygnalow pobiera 3 argumenty, a nie jeden. W typ
przypadku zamiast ustawia sa_handler naley ustawi
sa_sigaction. (Pole sa_sigaction zostalo dodane w
Linuksie 2.1.86).
Parametr siginfo_t z sa_sigaction jest struktur zawierajc nastpujce
elementy:
siginfo_t {
int si_signo; /* Numer sygnalu */
int si_errno; /* Warto errno */
int si_code; /* Kod sygnalu */
pid_t si_pid; /* Id procesu wysylajcego */
uid_t si_uid; /* Rzeczywisty ID uytkownika wysylajcego procesu */
int si_status; /* Kod zakoczenia lub sygnal */
clock_t si_utime; /* Czas spdzony w przestrzeni uytkownika */
clock_t si_stime; /* Czas spdzony w przestrzeni systemu */
sigval_t si_value; /* Warto sygnalu */
int si_int; /* sygnal POSIX.1b */
void * si_ptr; /* sygnal POSIX.1b */
void * si_addr; /* Adres pamici, ktory spowodowal bld */
int si_band; /* Zdarzenie grupy (band event) */
int si_fd; /* Deskryptor pliku */
}
si_signo, si_errno i si_code s zdefiniowane dla wszystkich sygnalow.
(si_signo nie jest uywane pod Linuksem). Reszta tej struktury moe by
uni, tak e powinno si czyta tylko te pola, ktore maj znaczenie dla
danego sygnalu. Sygnaly POSIX.1b i SIGCHLD wypelniaj si_pid i si_uid.
SIGCHLD wypelnia te si_status, si_utime i si_stime. si_int i si_ptr s
okrelone przez nadawc sygnalu POSIX.1b. SIGILL, SIGFPE, SIGSEGV i
SIGBUS wypelniaj si_addr adresem bldu. SIGPOLL wypelnia si_band i
si_fd.
si_code okrela, dlaczego sygnal zostal wyslany. Jest to warto, a nie
maska bitowa. Ponisza tabela pokazuje moliwe wartoci dla kadego
sygnalu:
+-----------------------------------------------------------------------+
| si_code |
+-----------+-----------------------------------------------------------+
|Warto | rodlo sygnalu |
+-----------+-----------------------------------------------------------+
|SI_USER | kill(), sigsend() lub raise() |
+-----------+-----------------------------------------------------------+
|SI_KERNEL | Jdro |
+-----------+-----------------------------------------------------------+
|SI_QUEUE | sigqueue() |
+-----------+-----------------------------------------------------------+
|SI_TIMER | wyganicie timera POSIX |
+-----------+-----------------------------------------------------------+
|SI_MESGQ | zmiana stanu kolejki komunikatow POSIX (od Linuksa 2.6.6) |
+-----------+-----------------------------------------------------------+
|SI_ASYNCIO | ukoczenie AIO |
+-----------+-----------------------------------------------------------+
|SI_SIGIO | kolejkowany SIGIO |
+-----------+-----------------------------------------------------------+
|SI_TKILL | tkill() lub tgkill() (od Linuksa 2.4.19) |
+-----------+-----------------------------------------------------------+
+-------------------------------------------+
| SIGILL |
+-----------+-------------------------------+
|ILL_ILLOPC | niedozwolony opcode |
+-----------+-------------------------------+
|ILL_ILLOPN | niedozwolony operand |
+-----------+-------------------------------+
|ILL_ILLADR | niedozwolony tryb adresowania |
+-----------+-------------------------------+
|ILL_ILLTRP | niedozwolona pulapka |
+-----------+-------------------------------+
|ILL_PRVOPC | uprzywilejowany kod operacji |
+-----------+-------------------------------+
|ILL_PRVREG | uprzywilejowany rejestr |
+-----------+-------------------------------+
|ILL_COPROC | bld koprocesora |
+-----------+-------------------------------+
|ILL_BADSTK | wewntrzny bld stosu |
+-----------+-------------------------------+
+------------------------------------------------------------------------+
| SIGFPE |
+-----------+------------------------------------------------------------+
|FPE_INTDIV | dzielenie calkowite przez zero |
+-----------+------------------------------------------------------------+
|FPE_INTOVF | przepelnienie liczby calkowitej |
+-----------+------------------------------------------------------------+
|FPE_FLTDIV | dzielenie wartoci zmiennoprzecinkowej przez zero |
+-----------+------------------------------------------------------------+
|FPE_FLTOVF | przekroczenie zakresu operacji zmiennoprzecinkowej |
+-----------+------------------------------------------------------------+
|FPE_FLTUND | przekroczenie (w dol) zakresu operacji zmiennoprzecinkowej |
+-----------+------------------------------------------------------------+
|FPE_FLTRES | niedokladny wynik operacji zmiennoprzecinkowej |
+-----------+------------------------------------------------------------+
|FPE_FLTINV | niepoprawna operacja zmiennoprzecinkowa |
+-----------+------------------------------------------------------------+
|FPE_FLTSUB | dolny indeks poza zakresem |
+-----------+------------------------------------------------------------+
+---------------------------------------------------------+
| SIGSEGV |
+------------+--------------------------------------------+
|SEGV_MAPERR | adres niemapowany do obiektu |
+------------+--------------------------------------------+
|SEGV_ACCERR | niepoprawne uprawnienia mapowanego obiektu |
+------------+--------------------------------------------+
+--------------------------------------------------+
| SIGBUS |
+-----------+--------------------------------------+
|BUS_ADRALN | niepoprawne wyrownanie adresu |
+-----------+--------------------------------------+
|BUS_ADRERR | nieistniejcy adres fizyczny |
+-----------+--------------------------------------+
|BUS_OBJERR | bld sprztowy specyficzny dla obiektu |
+-----------+--------------------------------------+
+---------------------------------------+
| SIGTRAP |
+-----------+---------------------------+
|TRAP_BRKPT | punkt wstrzymania procesu |
+-----------+---------------------------+
|TRAP_TRACE | ledzony proces zlapany |
+-----------+---------------------------+
+-----------------------------------------------------------------------+
| SIGCHLD |
+--------------+--------------------------------------------------------+
|CLD_EXITED | proces-dziecko si zakoczyl |
+--------------+--------------------------------------------------------+
|CLD_KILLED | proces-dziecko zostal zabity |
+--------------+--------------------------------------------------------+
|CLD_DUMPED | potomek zakoczyl si w nienormalny sposob |
+--------------+--------------------------------------------------------+
|LD_TRAPPED | ledzony potomek zostal zlapany |
+--------------+--------------------------------------------------------+
|CLD_STOPPED | proces-potomek zostal zatrzymany |
+--------------+--------------------------------------------------------+
|CLD_CONTINUED | zatrzymany potomek zostal wznowiony (od Linuksa 2.6.9) |
+--------------+--------------------------------------------------------+
+------------------------------------------------+
| SIGPOLL |
+---------+--------------------------------------+
|POLL_IN | dostpne dane na wejciu |
+---------+--------------------------------------+
|POLL_OUT | dostpne bufory wyjcia |
+---------+--------------------------------------+
|POLL_MSG | dostpna wiadomo na wejciu |
+---------+--------------------------------------+
|POLL_ERR | bld wejcia/wyjcia |
+---------+--------------------------------------+
|POLL_PRI | dostpne wejcie o wysokim priorytecie |
+---------+--------------------------------------+
|POLL_HUP | urzdzenie odlczone |
+---------+--------------------------------------+
WARTO ZWRACANA
sigaction() zwraca 0, jeeli zakoczy si pomylnie, lub -1, jeeli wystpi
bld.
B/LDY
EFAULT act lub oldact wskazuj na pami poza przestrzeni adresow procesu.
EINVAL Podano nieprawidlowy sygnal. Bdzie to te generowane w przypadku
proby zmienienia akcji dla sygnalow SIGKILL lub SIGSTOP, ktore
nie mog by przechwycone lub zignorowane.
UWAGI
Zgodnie z POSIX, zachowanie procesu po zignorowaniu sygnalu SIGFPE,
SIGILL lub SIGSEGV, niewygenerowanego przez kill() lub raise(), jest
niezdefiniowane. Dzielenie liczby calkowitej przez zero ma wynik
niezdefiniowany. Na niektorych architekturach generuje sygnal SIGFPE
(Take dzielenie najmniejszej ujemnej liczby calkowitej przez -1 moe
wygenerowa SIGFPE). Ignorowanie go moe prowadzi do nieskoczonej ptli.
POSIX.1-1990 zabranial ustawiania akcji dla SIGCHLD na SIG_IGN.
POSIX.1-2001 pozwala na to,tak e mona uy ignorowania SIGCHLD, eby
zapobiec tworzeniu procesow-duchow (patrz wait(2)). Niemniej jednak,
historyczne zachowanie systemow BSD i SystemV w zakresie ignorowania
SIGCHLD jest inne, tak wic jedyn calkowicie przenon metod zapewnienia,
e potomek po zakoczeniu nie zostanie procesem-duchem jest
przechwytywanie sygnalu SIGCHLD i wywolanie funkcji wait(2) lub
podobnej.
POSIX.1-1990 okrelal tylko SA_NOCLDSTOP. W POSIX.1-2001 dodano
SA_NOCLDWAIT, SA_RESETHAND, SA_NODEFER oraz SA_SIGINFO. Uywanie tych
nowych wartoci sa_flags moe by mniej przenone w aplikacjach
przewidzianych do uycia w starszych implementacjach Uniksa.
Obsluga SA_SIGINFO zostala dodana w Linuksie 2.2.
Flaga SA_RESETHAND jest kompatybilna z flag w SVr4 o tej samej nazwie.
Flaga SA_NODEFER jest kompatybilna z podobn flag z SVr4 dla jder
Linuksa 1.3.9 i nowszych.
sigaction() moe by wywolywany z drugim argumentem o wartoci null,
powodujc w ten sposob zapytanie o biecy handler sygnalu. Moe go te uy
do sprawdzenia, czy dany sygnal jest prawidlowy na obecnej maszynie. W
tym celu naley zarowno drugi, jak i trzeci argument ustawi na null.
Nie mona zablokowa sygnalow SIGKILL lub SIGSTOP (przez podanie ich w
sa_mask. Proby takie zostan zignorowane.
Zobacz sigsetops(3) dla szczegolow o operacjach na zbiorach sygnalow.
B/LDY
W jdrze 2.6.13 i wczeniejszych podanie SA_NODEFER w sa_flags
zapobiegalo maskowaniu nie tylko dostarczonego sygnalu podczas
wykonywania procedury obslugi sygnalu, ale take sygnalow okrelonych w
sa_mask. Ten bld zostal poprawiony w 2.6.14.
ZGODNE Z
POSIX, SVR4. SVr4 nie dokumentuje bldu EINTR.
NIEUDOKUMENTOWANE
Przed wprowadzeniem SA_SIGINFO rownie bylo moliwe otrzymanie pewnych
dodatkowych informacji - przez uycie sa_handler z drugim argumentem
bdcym typu struct sigcontext. Szczegoly mona znale w odpowiednich
rodlach jdra. To uycie jest obecnie przestarzale.
ZOBACZ TAKE
kill(1), kill(2), pause(2), sigaltstack(2), signal(2), sigpending(2),
sigprocmask(2), sigqueue(2), sigsuspend(2), wait(2), killpg(3),
raise(3), siginterrupt(3), sigsetops(3), sigvec(3), core(5), signal(7)
INFORMACJE O T/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.