Rechercher une page de manuel

Chercher une autre page de manuel:

sigaction

Autres langues

Langue: pl

Version: 2005\-09\-15 (ubuntu - 01/11/07)

Section: 2 (Appels système)

NAZWA

sigaction - bada i zmienia akcjê sygna³u

SK£ADNIA

#include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

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);
     void (*sa_sigaction)(int, siginfo_t *, void *);
     sigset_t sa_mask;
     int sa_flags;
     void (*sa_restorer)(void);
 }
 

Na niektórych architekturach czê¶æ tej struktury mo¿e byæ uni±: nie nale¿y ustawiaæ jednocze¶nie pól sa_handler oraz sa_sigaction.

Element sa_restorer jest przedawniony i nie powinno siê go u¿ywaæ. POSIX nie definiuje tego elementu.

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³. Funkcja ta ma jtylko eden argument, w którym bêdzie przekazany numer sygna³u.

Je¿eli warto¶æ SA_SIGINFO jest podana w sa_flags, to sa_sigaction (zamiast sa_handler) okre¶la funkcjê obs³ugi sygna³u dla signum. Funkcja ta otrzymuje numer sygna³u jako pierwszy argument, wska¼nik do siginfo_t jako drugi argument oraz wska¼nik do ucontext_t (zrzutowany na void *) jako jej trzeci argument.

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 flagi SA_NODEFER.

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) lub o jego wznowieniu (np. po otrzymaniu SIGCONT) (patrz wait(2)).
SA_NOCLDWAIT
(Linux 2.6 i kolejne) Je¿eli signum to SIGCHLD, to procesy potomne po ich zakoñczeniu nie bêd± przekszta³cone w procesy-duchy (zombie). Patrz tak¿e waitpid(2).
SA_RESETHAND
Odtwórz akcjê sygna³ow± do stanu domy¶lnego po wywo³aniu handlera sygna³ów. SA_ONESHOT jest przestarza³ym, niestandardowym synonimem tej flagi.
SA_ONSTACK
Wywo³aj handler sygna³u, u¿ywaj±c alternatywnego stosu ustawionego przez sigaltstack(2). Je¿eli ten alternatywny stos nie jest dostêpny, zostanie u¿yty stos domy¶lny.
SA_RESTART
Daj zachowanie, kompatybilne z semantyk± sygna³ow± BSD, czyni±c pewne wywo³ania systemowe odtwarzalnymi przez sygna³y.
SA_NODEFER
Nie chroñ sygna³ów od bycia odebranymi z ich w³asnego handlera.SA_NOMASK jest przestarza³ym, niestandardowym synonimem tej flagi.
SA_SIGINFO
Handler sygna³ów pobiera 3 argumenty, a nie jeden. W typ przypadku zamiast ustawiaæ sa_handler nale¿y ustawiæ sa_sigaction. (Pole sa_sigaction zosta³o dodane w Linuksie 2.1.86).

Parametr siginfo_t z sa_sigaction jest struktur± zawieraj±c± nastêpuj±ce elementy:

 
 siginfo_t {
     int      si_signo;  /* Numer sygna³u */
     int      si_errno;  /* Warto¶æ errno */
     int      si_code;   /* Kod sygna³u */
     pid_t    si_pid;    /* Id procesu wysy³aj±cego */
     uid_t    si_uid;    /* Rzeczywisty ID u¿ytkownika wysy³aj±cego procesu */
     int      si_status; /* Kod zakoñczenia lub sygna³ */
     clock_t  si_utime;  /* Czas spêdzony w przestrzeni u¿ytkownika */
     clock_t  si_stime;  /* Czas spêdzony w przestrzeni systemu */
     sigval_t si_value;  /* Warto¶æ sygna³u */
     int      si_int;    /* sygna³ POSIX.1b */
     void *   si_ptr;    /* sygna³ POSIX.1b */
     void *   si_addr;   /* Adres pamiêci, który spowodowa³ b³±d */
     int      si_band;   /* Zdarzenie grupy (band event) */
     int      si_fd;     /* Deskryptor pliku */
 }
 

si_signo, si_errno i si_code s± zdefiniowane dla wszystkich sygna³ów. (si_signo nie jest u¿ywane pod Linuksem). Reszta tej struktury mo¿e byæ uni±, tak ¿e powinno siê czytaæ tylko te pola, które maj± znaczenie dla danego sygna³u. Sygna³y POSIX.1b i SIGCHLD wype³niaj± si_pid i si_uid. SIGCHLD wype³nia te¿ si_status, si_utime i si_stime. si_int i si_ptr s± okre¶lone przez nadawcê sygna³u POSIX.1b. SIGILL, SIGFPE, SIGSEGV i SIGBUS wype³niaj± si_addr adresem b³êdu. SIGPOLL wype³nia si_band i si_fd.

si_code okre¶la, dlaczego sygna³ zosta³ wys³any. Jest to warto¶æ, a nie maska bitowa. Poni¿sza tabela pokazuje mo¿liwe warto¶ci dla ka¿dego sygna³u:

si_code
Warto¶æ ¬ród³o sygna³u
SI_USER kill(), sigsend() lub raise()
SI_KERNEL J±dro
SI_QUEUE sigqueue()
SI_TIMER wyga¶niêcie timera POSIX
SI_MESGQ zmiana stanu kolejki komunikatów POSIX (od Linuksa 2.6.6)
SI_ASYNCIO ukoñczenie 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 pu³apka
ILL_PRVOPC uprzywilejowany kod operacji
ILL_PRVREG uprzywilejowany rejestr
ILL_COPROC b³±d koprocesora
ILL_BADSTK wewnêtrzny b³±d stosu
SIGFPE
FPE_INTDIV dzielenie ca³kowite przez zero
FPE_INTOVF przepe³nienie liczby ca³kowitej
FPE_FLTDIV dzielenie warto¶ci zmiennoprzecinkowej przez zero
FPE_FLTOVF przekroczenie zakresu operacji zmiennoprzecinkowej
FPE_FLTUND przekroczenie (w dó³) zakresu operacji zmiennoprzecinkowej
FPE_FLTRES niedok³adny 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 wyrównanie adresu
BUS_ADRERR nieistniej±cy adres fizyczny
BUS_OBJERR b³±d sprzêtowy specyficzny dla obiektu
SIGTRAP
TRAP_BRKPT punkt wstrzymania procesu
TRAP_TRACE ¶ledzony proces z³apany
SIGCHLD
CLD_EXITED proces-dziecko siê zakoñczy³
CLD_KILLED proces-dziecko zosta³ zabity
CLD_DUMPED potomek zakoñczy³ siê w nienormalny sposób
LD_TRAPPED ¶ledzony potomek zosta³ z³apany
CLD_STOPPED proces-potomek zosta³ zatrzymany
CLD_CONTINUED zatrzymany potomek zosta³ wznowiony (od Linuksa 2.6.9)
SIGPOLL
POLL_IN dostêpne dane na wej¶ciu
POLL_OUT dostêpne bufory wyj¶cia
POLL_MSG dostêpna wiadomo¶æ na wej¶ciu
POLL_ERR b³±d wej¶cia/wyj¶cia
POLL_PRI dostêpne wej¶cie o wysokim priorytecie
POLL_HUP urz±dzenie od³±czone

WARTO¦Æ ZWRACANA

sigaction() zwraca 0, je¿eli zakoñczy siê pomy¶lnie, lub -1, je¿eli wyst±pi b³±d.

B£ÊDY

EFAULT
act lub oldact wskazuj± na pamiêæ poza przestrzeni± adresow± procesu.
EINVAL
Podano nieprawid³owy sygna³. Bêdzie to te¿ generowane w przypadku próby zmienienia akcji dla sygna³ów SIGKILL lub SIGSTOP, które nie mog± byæ przechwycone lub zignorowane.

UWAGI

Zgodnie z POSIX, zachowanie procesu po zignorowaniu sygna³u SIGFPE, SIGILL lub SIGSEGV, niewygenerowanego przez kill() lub raise(), jest niezdefiniowane. Dzielenie liczby ca³kowitej przez zero ma wynik niezdefiniowany. Na niektórych architekturach generuje sygna³ SIGFPE (Tak¿e dzielenie najmniejszej ujemnej liczby ca³kowitej przez -1 mo¿e wygenerowaæ SIGFPE). Ignorowanie go mo¿e prowadziæ do nieskoñczonej pêtli.

POSIX.1-1990 zabrania³ ustawiania akcji dla SIGCHLD na SIG_IGN. POSIX.1-2001 pozwala na to,tak ¿e mo¿na u¿yæ ignorowania SIGCHLD, ¿eby zapobiec tworzeniu procesów-duchów (patrz wait(2)). Niemniej jednak, historyczne zachowanie systemów BSD i SystemV w zakresie ignorowania SIGCHLD jest inne, tak wiêc jedyn± ca³kowicie przeno¶n± metod± zapewnienia, ¿e potomek po zakoñczeniu nie zostanie procesem-duchem jest przechwytywanie sygna³u SIGCHLD i wywo³anie funkcji wait(2) lub podobnej.

POSIX.1-1990 okre¶la³ tylko SA_NOCLDSTOP. W POSIX.1-2001 dodano SA_NOCLDWAIT, SA_RESETHAND, SA_NODEFER oraz SA_SIGINFO. U¿ywanie tych nowych warto¶ci sa_flags mo¿e byæ mniej przeno¶ne w aplikacjach przewidzianych do u¿ycia w starszych implementacjach Uniksa.

Obs³uga SA_SIGINFO zosta³a 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 j±der Linuksa 1.3.9 i nowszych.

sigaction() mo¿e byæ wywo³ywany z drugim argumentem o warto¶ci null, powoduj±c w ten sposób zapytanie o bie¿±cy handler sygna³u. Mo¿e go te¿ u¿yæ do sprawdzenia, czy dany sygna³ jest prawid³owy na obecnej maszynie. W tym celu nale¿y zarówno drugi, jak i trzeci argument ustawiæ na null.

Nie mo¿na zablokowaæ sygna³ów SIGKILL lub SIGSTOP (przez podanie ich w sa_mask. Próby takie zostan± zignorowane.

Zobacz sigsetops(3) dla szczegó³ów o operacjach na zbiorach sygna³ów.

B£ÊDY

W j±drze 2.6.13 i wcze¶niejszych podanie SA_NODEFER w sa_flags zapobiega³o maskowaniu nie tylko dostarczonego sygna³u podczas wykonywania procedury obs³ugi sygna³u, ale tak¿e sygna³ów okre¶lonych w sa_mask. Ten b³±d zosta³ poprawiony w 2.6.14.

ZGODNE Z

POSIX, SVR4. SVr4 nie dokumentuje b³êdu EINTR.

NIEUDOKUMENTOWANE

Przed wprowadzeniem SA_SIGINFO równie¿ by³o mo¿liwe otrzymanie pewnych dodatkowych informacji - przez u¿ycie sa_handler z drugim argumentem bêd±cym typu struct sigcontext. Szczegó³y mo¿na znale¼æ w odpowiednich ¼ród³ach j±dra. To u¿ycie jest obecnie przestarza³e.

ZOBACZ TAK¯E

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)
Depuis que j'ai une maîtresse que j'aime, je n'ai plus envie de
tromper ma femme.
-+- Sacha Guitry -+-