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

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)