Provided by: manpages-pl-dev_0.6-2_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);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

       siginfo_t: _POSIX_C_SOURCE >= 199309L

OPIS

       Wywołanie  systemowe  sigaction()  jest  używane  do  zmieniania  akcji, którą obiera proces po odebraniu
       określonego sygnału. (Wprowadzenie do sygnałów można znaleźć  w podręczniku signals(7)).

       signum określa sygnał i może być dowolnym prawidłowym sygnałem poza SIGKILL i SIGSTOP.

       Jeśli act nie jest NULL-em, to nowa akcja dla sygnału signum jest brana z  act.  Jeśli  oldact  też  jest
       różny od NULL, 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 tylko jeden
       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 (rzutowany na void *) jako jej trzeci  argument
       (Zazwyczaj  funkcja obsługi sygnału w ogóle nie używa trzeciego argumentu. Więcej informacji o ucontext_t
       można znaleźć w getcontext(3)).

       sa_mask określa maskę sygnałów, które powinny być blokowane  (tj.  dodane  do  maski  sygnałów  wątku,  z
       którego  sygnał  został  wywołany) podczas wywoływania funkcji obsługi sygnałów. Dodatkowo, sygnał, który
       wywołał tę funkcję obsługi  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   jest   równe  SIGCHLD,  to  nie  są  odbierane  powiadomienia  o  zatrzymaniu
                  procesu-dziecka (np. gdy dziecko otrzyma jeden z SIGSTOP, SIGTSTP, SIGTTIN lub SIGTTOU) ani  o
                  jego  wznowieniu  (np.  po  otrzymaniu SIGCONT) (patrz wait(2)). Flaga ta ma znaczenie tylko w
                  przypadku ustawiania funkcji obsługi sygnału SIGCHLD.

           SA_NOCLDWAIT (od Linuksa 2.6)
                  Jeśli signum jest równy SIGCHLD, to dzieci po swoim zakończeniu nie zostaną  przekształcone  w
                  zombie.  Patrz także waitpid(2). Znacznik ma znaczenie tylko ustanawiania funkcji obsługującej
                  sygnał SIGCHLD lub podczas ustawiania tego sygnału na SIG_DLF.

                  Jeśli znacznik SA_NOCLDWAIT jest ustawiony podczas ustanawiania  funkcji  obsługującej  sygnał
                  SIGCHLD,  to  POSIX.1  nie  określa,  czy sygnał SIGCHLD po zakończeniu procesu potomnego. Pod
                  Linuksem sygnał SIGCHLD jest w takim  przypadku  generowany;  niektóre  inne  systemy  go  nie
                  generują.

           SA_NODEFER
                  Nie  chroni  sygnałów  przed  ich  odebraniem  z  ich  własnej  procedury obsługi. Znacznik ma
                  znaczenie tylko podczas ustanawiania procedury obsługi sygnału. SA_NOMASK jest  przestarzałym,
                  niestandardowym synonimem tego znacznika.

           SA_ONSTACK
                  Wywołuje   funkcję   obsługi   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.
                  Flaga ta ma znaczenie tylko w przypadku ustanawiania funkcji obsługi sygnału.

           SA_RESETHAND
                  Odtwarza  akcję  sygnałową do stanu domyślnego po wejściu funkcji obsługi sygnału. Flaga ta ma
                  znaczenie  tylko  w  przypadku  ustanawiania  funkcji   obsługi   sygnału.   SA_ONESHOT   jest
                  przestarzałym, niestandardowym synonimem tej flagi.

           SA_RESTART
                  Dostarcza  zachowania  kompatybilnego  z  semantyką  sygnałową  BSD,  czyniąc  pewne wywołania
                  systemowe odtwarzalnymi przez sygnały. Flaga ta ma znaczenie  podczas  ustanawiania  procedury
                  obsługi  sygnału.  Informacje  na  temat  odtwarzania  wywołań  systemowych  można  znaleźć  w
                  podręczniku signal(7).

           SA_SIGINFO (od Linuksa 2.2)
                  Funkcja obsługi sygnałów pobiera trzy argumenty, a nie jeden. W typ przypadku zamiast ustawiać
                  sa_handler  należy  ustawić sa_sigaction. Flaga ta ma znaczenie tylko w przypadku ustanawiania
                  funkcji obsługi sygnału.

       Argument 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ść zmiennej errno */
               int      si_code;     /* Kod sygnału */
               int      si_trapno;   /* Numer pułapki, które spowodowała
                                        sprzętowe wygenerowanie sygnału
                                        (nieużywane na większości architektur) */
               pid_t    si_pid;      /* ID procesu wysyłającego */
               uid_t    si_uid;      /* Rzeczywiste ID użytkownika procesu wysyłającego */
               int      si_status;   /* Kod lub sygnał zakończenia */
               clock_t  si_utime;    /* Czas zużyty w przestrzeni użytkownika */
               clock_t  si_stime;    /* Czas zużyty przez system operacyjny */
               sigval_t si_value;    /* Wartość sygnału */
               int      si_int;      /* Sygnał POSIX.1b */
               void    *si_ptr;      /* Sygnał POSIX.1b */
               int      si_overrun;  /* Licznik przekroczeń timerów; timery POSIX.1b */
               int      si_timerid;  /* ID timera; timery POSIX.1b */
               void    *si_addr;     /* Adres pamięci powodujący błąd */
               long     si_band;     /* Grupa zdarzenia (był int w
                                        glibc 2.3.2 i wcześniejszych) */
               int      si_fd;       /* Deskryptor pliku */
               short    si_addr_lsb; /* Mniej istotny bit adresu
                                        (od Linuksa 2.6.32) */
           }

       si_signo, si_errno i si_code są zdefiniowane dla  wszystkich  sygnałów.  (Generalnie  si_errno  nie  jest
       używane  pod Linuksem). Pozostałe pola struktury mogą być unią; powinno się odczytywać tylko pola istotne
       dla danego sygnału.

       * Sygnały wysłane przez kill(2) i sigqueue(3) mają wypełnione pola si_pid oraz si_uid. Dodatkowo  sygnały
         wysłane  przez  sigqueue(3)  mają  w  polach  si_int  i  si_ptr ustawione wartości podane przez nadawcę
         sygnału; szczegóły opisano w sigqueue(3).

       * Sygnały wysłane przez timery POSIX.1b (od Linuksa 2.6) mają uzupełnione pola si_overrun  i  si_timerid.
         Pole  si_timerid zawiera wewnętrzny identyfikator używany przez jądro do identyfikacji timera; nie jest
         to ten sam identyfikator, który zwraca timer_create(2). Pole si_overrun zawiera informację o  tym,  ile
         razy  timer  się  przepełnił — jest to ta sama informacja, którą zwraca timer_getoverrun(2). Pola te są
         niestandardowymi rozszerzeniami Linuksa.

       * Sygnały wysłane w celu notyfikacji kolejki komunikatów (patrz opis SIGEV_SIGNAL in  mq_notify(3))  mają
         pola  si_int/si_ptr  wypełnione  wartościami  sigev_value  przekazanymi do mq_notify(3); ponadto si_pid
         zawiera identyfikator procesu wysyłającego sygnał, a si_uid  rzeczywisty  identyfikator  użytkownika  -
         nadawcy sygnału.

       * SIGCHLD ustawia pola si_pid, si_uid, si_status, si_utime i si_stime, dostarczając informacji o procesie
         potomnym.  Pole  si_pid  jest  identyfikatorem  potomka,  si_uid  jest  identyfikatorem   rzeczywistego
         użytkownika procesu potomnego. Pole si_status zawiera kod zakończenia potomka (jeśli si_code jest równe
         CLD_EXITED) lub numer sygnału, który spowodował zmianę stanu. Pola si_utime i si_stime zawierają  czasy
         spędzone  przez  potomka w przestrzeniach użytkownika i systemowej; w przeciwieństwie do getrusage(2) i
         times(2), pola te nie zawierają czasów oczekiwania na potomków. W jądrach  wcześniejszych  niż  2.6,  a
         także  w  2.6.27  i nowszych, pola zawierają czas CPU w jednostkach sysconf(_SC_CLK_TCK). W jądrach 2.6
         wcześniejszych niż 2.6.27 z powodu błędu używane były (konfigurowalne) jednostki jiffy (patrz time(7)).

       * SIGILL, SIGFPE, SIGSEGV, SIGBUS oraz SIGTRAP wypełniają si_addr,  ustawiając  w  nim  adres  błędu.  Na
         niektórych  architekturach  sygnał  wypełniają  także pole si_trapno. Niektóre błędy pochodne SIGBUS, w
         szczególności BUS_MCEERR_AO i BUS_MCEERR_AR ustawiają  także  si_addr_lsb.  Pole  to  oznacza  najmniej
         znaczący  bit  adresu,  zatem  i  rozmiary uszkodzeń. Na przykład jeśli cała strona została uszkodzona,
         si_addr_lsb zawierać będzie log2(sysconf(_SC_PAGESIZE)). BUS_MCERR_* i  si_addr_lsb  są  rozszerzeniami
         specyficznymi dla Linuksa.

       * SIGIO/SIGPOLL  (te  dwie  nazwy  są  synonimami pod Linuksem) wypełnia pola si_band i si_fd.  Zdarzenie
         si_band jest maską bitową zawierającą te same wartości, które poll(2) umieszcza w  polu  revents.  Pole
         si_fd oznacza deskryptor pliku, na którym wystąpiło dane zdarzenie wejścia/wyjścia.

       si_code  jest  wartością  (a  nie  maską  bitową)  określającą powód wysłania sygnału. Poniżej zestawiono
       wartości, które mogą występować w si_code dowolnego sygnału razem z  powodami,  dla  których  sygnał  był
       wygenerowany.

           SI_USER        kill(2)

           SI_KERNEL      Wysyłany przez jądro.

           SI_QUEUE       sigqueue(3)

           SI_TIMER       Wygaśnięcie timera POSIX

           SI_MESGQ       Zmiana stanu kolejki komunikatów POSIX (od Linuksa 2.6.6); patrz mq_notify(3)

           SI_ASYNCIO     Ukończenie asynchronicznej operacji wejścia/wyjścia

           SI_SIGIO       Kolejkowany SIGIO (tylko w jądrach do wersji 2.2 Linuksa; od Linuksa 2.4 SIGIO/SIGPOLL
                          wypełniają si_code, tak jak to opisano poniżej).

           SI_TKILL       tkill(2)  lub tgkill(2)  (od Linuksa 2.4.19)

       Następujące wartości mogą zostać umieszczone w si_code sygnału 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

       Następujące wartości mogą zostać umieszczone w si_code sygnału 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

       Następujące wartości mogą zostać umieszczone w si_code sygnału SIGSEGV:

           SEGV_MAPERR    adres niemapowany do obiektu

           SEGV_ACCERR    niepoprawne uprawnienia mapowanego obiektu

       Następujące wartości mogą zostać umieszczone w si_code sygnału SIGBUS:

           BUS_ADRALN     niepoprawne wyrównanie adresu

           BUS_ADRERR     nieistniejący adres fizyczny

           BUS_OBJERR     błąd sprzętowy specyficzny dla obiektu

           BUS_MCEERR_AR (od Linuksa 2.6.32)
                          Sprzętowy błąd pamięci podczas sprawdzania komputera; wymagane podjęcie akcji.

           BUS_MCEERR_AO (od Linuksa 2.6.32)
                          Wykryto sprzętowy błąd pamięci w procesie; opcjonalne podjęcie akcji.

       Następujące wartości mogą zostać umieszczone w si_code sygnału SIGTRAP:

           TRAP_BRKPT     punkt wstrzymania procesu

           TRAP_TRACE     śledzony proces złapany

           TRAP_BRANCH (od Linuksa 2.4)
                          śledzone rozgałęzienie procesu złapane

           TRAP_HWBKPT (od Linuksa 2.4)
                          pułapka sprzętowa

       Następujące wartości mogą zostać umieszczone w si_code sygnału SIGCHLD:

           CLD_EXITED     proces-dziecko się zakończył

           CLD_KILLED     proces-dziecko został zabity

           CLD_DUMPED     potomek zakończył się w nienormalny sposób

           CLD_TRAPPED    śledzony potomek został złapany

           CLD_STOPPED    proces-potomek został zatrzymany

           CLD_CONTINUED  zatrzymany potomek został wznowiony (od Linuksa 2.6.9)

       Następujące wartości mogą zostać umieszczone w si_code sygnału SIGIO/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() w przypadku powodzenia zwraca 0. W razie wystąpienia błędu zwracane jest -1 i ustawiana  jest
       zmienna errno wskazując na 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.

ZGODNE Z

       POSIX.1-2001, SVr4.

UWAGI

       Potomek utworzony przez fork(2) dziedziczy kopię ustawień sygnałów  swojego  rodzica.  Podczas  execve(2)
       ustawienia  procedur  obsługi  sygnałów  są  resetowane  do  wartości  domyślnych,  z  wyjątkiem sygnałów
       ignorowanych, które nie są zmieniane (i będą dalej ignorowane po wywołaniu execve(2)).

       Zgodnie z POSIX, zachowanie procesu po zignorowaniu sygnału SIGFPE, SIGILL lub SIGSEGV, niewygenerowanego
       przez  kill(2)  lub  raise(3),  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 System V 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.

       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.

       Listę  funkcji, które można bezpiecznie wywołać w procedurze obsługi sygnału, można znaleźć w podręczniku
       signal(7).

   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 Linux. To użycie jest obecnie przestarzałe.

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.

PRZYKŁAD

       Patrz mprotect(2).

ZOBACZ TAKŻE

       kill(1),  kill(2),  killpg(2),  pause(2),  restart_syscall(2),  sigaltstack(2),  signal(2),  signalfd(2),
       sigpending(2),   sigprocmask(2),   sigsuspend(2),   wait(2),   raise(3),   siginterrupt(3),  sigqueue(3),
       sigsetops(3), sigvec(3), core(5), signal(7)

O STRONIE

       Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis  projektu,  informacje
       dotyczące   zgłaszania   błędów,   oraz   najnowszą   wersję   oryginału   można   znaleźć   pod  adresem
       http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami  polskiego  tłumaczenia  niniejszej   strony   podręcznika   man   są:   Przemek   Borys   (PTM)
       <pborys@dione.ids.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

       Polskie  tłumaczenie  jest  częścią  projektu  manpages-pl;  uwagi,  pomoc,  zgłaszanie błędów na stronie
       http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją  3.71 oryginału.