Rechercher une page de manuel
sigaction
Langue: pl
Version: 2005\-09\-15 (ubuntu - 16/08/07)
Section: 2 (Appels système)
NAZWA
sigaction - bada i zmienia akcjê sygna³uSK£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)NOUVEAU KIT LINUX REDHAT 5.2 POUR WIN 95/98
-+- Sybex in Guide du linuxien pervers - "L'incompétance en action" -+-
Contenus ©2006-2008 Benjamin Poulain
Design ©2006-2008 Maxime Vantorre