Provided by: manpages-pl-dev_20060617-3_all bug

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.