Provided by: manpages-pl-dev_4.15.0-9_all bug

NAZWA

       sigaction, rt_sigaction - bada i zmienia akcję sygnału

SKŁADNIA

       #include <signal.h>

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

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

       sigaction():
           _POSIX_C_SOURCE

       siginfo_t:
           _POSIX_C_SOURCE >= 199309L

OPIS

       Wywołanie  systemowe sigaction() jest używane do zmieniania akcji, którą odbiera 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.

       Pole  sa_restorer  nie  jest  przeznaczone do bezpośredniego stosowania (POSIX nie określa
       pola sa_restorer). Więcej informacji o przeznaczeniu tego pola można znaleźć w podręczniku
       sigreturn(2).

       sa_handler  specifies  the  action  to  be  associated  with  signum  and is be one of the
       following:

       * SIG_DFL for the default action.

       * SIG_IGN to ignore this signal.

       * A pointer to a signal handling function.  This function receives the  signal  number  as
         its only argument.

       If  SA_SIGINFO  is  specified  in  sa_flags,  then  sa_sigaction  (instead  of sa_handler)
       specifies  the  signal-handling  function  for  signum.   This  function  receives   three
       arguments, as described below.

       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
              Do not add the signal to the thread's signal mask while the handler  is  executing,
              unless the signal is specified in act.sa_mask.  Consequently, a further instance of
              the signal may be delivered to the thread while it is executing the handler.   This
              flag is meaningful only when establishing a signal handler.

              SA_NOMASK is an obsolete, nonstandard synonym for this flag.

       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 is an obsolete, nonstandard synonym for this flag.

       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_RESTORER
              Nie jest przeznaczone do bezpośredniego stosowania. Flaga  ta  jest  używana  przez
              biblioteki  C  do wskazania, że pole sa_restorer zawiera adres "trampoliny sygnału"
              Więcej szczegółów w podręczniku sigreturn(2).

       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.

       SA_UNSUPPORTED (od Linuksa 5.11)
              Used to dynamically probe for flag bit support.

              If an attempt to register a handler succeeds with this flag  set  in  act->sa_flags
              alongside  other  flags  that  are  potentially  unsupported  by the kernel, and an
              immediately subsequent sigaction()  call specifying the same signal number and with
              a  non-NULL  oldact  argument yields SA_UNSUPPORTED clear in oldact->sa_flags, then
              oldact->sa_flags may be used as a  bitmask  describing  which  of  the  potentially
              unsupported  flags  are,  in fact, supported.  See the section "Dynamically probing
              for flag bit support" below for more details.

       SA_EXPOSE_TAGBITS (od Linuksa 5.11)
              Normally, when delivering a signal, an architecture-specific set of  tag  bits  are
              cleared   from   the  si_addr  field  of  siginfo_t.   If  this  flag  is  set,  an
              architecture-specific subset of the tag bits will be preserved in si_addr.

              Programs that need to be compatible with Linux versions older than  5.11  must  use
              SA_UNSUPPORTED to probe for support.

   The siginfo_t argument to a SA_SIGINFO handler
       When  the  SA_SIGINFO  flag  is  specified  in act.sa_flags, the signal handler address is
       passed via the act.sa_sigaction field.  This handler takes three arguments, as follows:

           void
           handler(int sig, siginfo_t *info, void *ucontext)
           {
               ...
           }

       These three arguments are as follows

       sig    The number of the signal that caused invocation of the handler.

       info   A pointer to a siginfo_t, which is a structure containing further information about
              the signal, as described below.

       ucontext
              This is a pointer to a ucontext_t structure, cast to void *.  The structure pointed
              to by this field  contains  signal  context  information  that  was  saved  on  the
              user-space stack by the kernel; for details, see sigreturn(2).  Further information
              about the ucontext_t structure  can  be  found  in  getcontext(3)   and  signal(7).
              Commonly, the handler function doesn't make any use of the third argument.

       The siginfo_t data type is a structure with the following fields:

           siginfo_t {
               int      si_signo;     /* Signal number */
               int      si_errno;     /* An errno value */
               int      si_code;      /* Signal code */
               int      si_trapno;    /* Trap number that caused
                                         hardware-generated signal
                                         (unused on most architectures) */
               pid_t    si_pid;       /* Sending process ID */
               uid_t    si_uid;       /* Real user ID of sending process */
               int      si_status;    /* Exit value or signal */
               clock_t  si_utime;     /* User time consumed */
               clock_t  si_stime;     /* System time consumed */
               union sigval si_value; /* Signal value */
               int      si_int;       /* POSIX.1b signal */
               void    *si_ptr;       /* POSIX.1b signal */
               int      si_overrun;   /* Timer overrun count;
                                         POSIX.1b timers */
               int      si_timerid;   /* Timer ID; POSIX.1b timers */
               void    *si_addr;      /* Memory location which caused fault */
               long     si_band;      /* Band event (was int in
                                         glibc 2.3.2 and earlier) */
               int      si_fd;        /* File descriptor */
               short    si_addr_lsb;  /* Least significant bit of address
                                         (since Linux 2.6.32) */
               void    *si_lower;     /* Lower bound when address violation
                                         occurred (since Linux 3.19) */
               void    *si_upper;     /* Upper bound when address violation
                                         occurred (since Linux 3.19) */
               int      si_pkey;      /* Protection key on PTE that caused
                                         fault (since Linux 4.6) */
               void    *si_call_addr; /* Address of system call instruction
                                         (since Linux 3.5) */
               int      si_syscall;   /* Number of attempted system call
                                         (since Linux 3.5) */
               unsigned int si_arch;  /* Architecture of attempted system call
                                         (since Linux 3.5) */
           }

       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ą pole si_addr, ustawiając  w  nim
         adres błędu. Na niektórych architekturach sygnały 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)).  Gdy  jako   odpowiedź   na   zdarzenie   ptrace(2)
         (PTRACE_EVENT_foo)  zostanie  dostarczony  SIGTRAP,  pole  si_addr  nie jest wypełnione,
         natomiast pola si_pid i si_uid są  wypełnione  identyfikatorami  odpowiednio  procesu  i
         użytkownika  odpowiedzialnego  za  dostarczenie  pułapki.  W  przypadku  seccomp(2) jako
         dostarczenie  zdarzenia  pokazany  zostanie  zrzut.   BUS_MCERR_*   i   si_addr_lsb   są
         rozszerzeniami specyficznymi dla Linuksa.

         SEGV_BNDERR będący podbłędem SIGSEGV wypełnia pola si_lower i si_upper.

         SEGV_PKUERR będący podbłędem SIGSEGV wypełnia pole si_pkey.

       * 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; więcej szczegółów w opisie F_SETSIG w podręczniku fcntl(2).

       * SIGSYS, generowany (od Linuksa 3.5) gdy filtr seccomp zwróci SECCOMP_RET_TRAP,  wypełnia
         pola si_call_addr, si_syscall, si_arch, si_errno i inne, zgodnie z opisem z seccomp(2).

   The si_code field
       The  si_code  field  inside  the  siginfo_t argument that is passed to a SA_SIGINFO signal
       handler is a value (not a bit mask)  indicating why this signal was sent.  For a ptrace(2)
       event, si_code will contain SIGTRAP and have the ptrace event in the high byte:

           (SIGTRAP | PTRACE_EVENT_foo << 8).

       For  a  non-ptrace(2)   event,  the values that can appear in si_code are described in the
       remainder of this section.  Since glibc 2.20, the definitions of most of these symbols are
       obtained  from  <signal.h>  by  defining  feature test macros (before including any header
       file) as follows:

       *  _XOPEN_SOURCE with the value 500 or greater;

       *  _XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED; or

       *  _POSIX_C_SOURCE with the value 200809L or greater.

       For the TRAP_* constants, the symbol definitions are provided only in the first two cases.
       Before glibc 2.20, no feature test macros were required to obtain these symbols.

       For  a  regular signal, the following list shows the values which can be placed in si_code
       for any signal, along with the reason that the signal was generated.

           SI_USER
                  kill(2).

           SI_KERNEL
                  Wysyłany przez jądro.

           SI_QUEUE
                  sigqueue(3).

           SI_TIMER
                  Wygaśnięcie timera POSIX.

           SI_MESGQ (od Linuksa 2.6.6)
                  Zmiana stanu kolejki komunikatów POSIX; 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 (od Linuksa 2.4.19)
                  tkill(2) lub tgkill(2)

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

           ILL_ILLOPC
                  Niedozwolony kod operacji.

           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 wartości całkowitej 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.

           SEGV_BNDERR (od Linuksa 3.19)
                  Niepowodzenie sprawdzenia przypisania adresu.

           SEGV_PKUERR (od Linuksa 4.6)
                  Access was denied by memory protection keys.  See pkeys(7).  The protection key
                  which applied to this access is available via si_pkey.

       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, tylko IA64)
                  Śledzone rozgałęzienie procesu złapane.

           TRAP_HWBKPT (od Linuksa 2.4, tylko IA64)
                  Pułapka sprzętowa.

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

           CLD_EXITED
                  Proces potomny się zakończył.

           CLD_KILLED
                  Proces potomny został zabity.

           CLD_DUMPED
                  Potomek zakończył się w nieprawidłowy sposób.

           CLD_TRAPPED
                  Śledzony potomek został złapany.

           CLD_STOPPED
                  Proces potomny został zatrzymany.

           CLD_CONTINUED (od Linuksa 2.6.9)
                  Zatrzymany proces potomny został wznowiony.

       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.

       Następująca wartość może zostać umieszczona w si_code sygnału SIGSYS:

           SYS_SECCOMP (od Linuksa 3.5)
                  Wyzwolone przez regułę filtra seccomp(2).

   Dynamically probing for flag bit support
       The sigaction()  call on Linux accepts unknown bits set in  act->sa_flags  without  error.
       The  behavior  of  the  kernel starting with Linux 5.11 is that a second sigaction()  will
       clear unknown bits from oldact->sa_flags.  However,  historically,  a  second  sigaction()
       call would typically leave those bits set in oldact->sa_flags.

       This  means  that support for new flags cannot be detected simply by testing for a flag in
       sa_flags, and a program must test that SA_UNSUPPORTED has been cleared before  relying  on
       the contents of sa_flags.

       Since  the behavior of the signal handler cannot be guaranteed unless the check passes, it
       is wise to either block the affected signal while registering the handler  and  performing
       the  check  in  this  case,  or  where  this is not possible, for example if the signal is
       synchronous, to issue the second sigaction()  in the signal handler itself.

       In kernels that do not support a specific flag, the kernel's behavior is as  if  the  flag
       was not set, even if the flag was set in act->sa_flags.

       The  flags  SA_NOCLDSTOP,  SA_NOCLDWAIT,  SA_SIGINFO,  SA_ONSTACK, SA_RESTART, SA_NODEFER,
       SA_RESETHAND, and, if defined by the architecture, SA_RESTORER may not be reliably  probed
       for  using  this  mechanism,  because they were introduced before Linux 5.11.  However, in
       general, programs may assume that these flags are supported,  since  they  have  all  been
       supported since Linux 2.6, which was released in the year 2003.

       See EXAMPLES below for a demonstration of the use of SA_UNSUPPORTED.

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, POSIX.1-2008, SVr4.

UWAGI

       Dziecko utworzone przez fork(2) dziedziczy kopię ustawień  sygnałów  od  swojego  rodzica.
       Podczas  wywołania  execve(2)  przywracane  są  wartości  domyślne  ustawień,  z wyjątkiem
       ustawienia ignorowania sygnału, które nie jest zmieniane.

       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 i  późniejsze
       pozwalają  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_NOCLDSTOP,
       SA_NOCLDWAIT, SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART 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.

       The SA_NODEFER flag is compatible with the SVr4 flag of the same name under kernels  1.3.9
       and  later.   On older kernels the Linux implementation allowed the receipt of any signal,
       not just the one we are installing (effectively overriding any sa_mask settings).

       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-safety(7).

   Różnice biblioteki C/jądra
       Funkcja opakowująca glibc dla sigaction() daje błąd (EINVAL) przy próbie zmiany dyspozycji
       dwóch sygnałów czasu rzeczywistego używanych wewnętrznie przez implementację wątkową NPTL.
       Więcej szczegółów w podręczniku nptl(7).

       On  architectures  where the signal trampoline resides in the C library, the glibc wrapper
       function for sigaction()  places the address of the trampoline code in the act.sa_restorer
       field and sets the SA_RESTORER flag in the act.sa_flags field.  See sigreturn(2).

       Oryginalne  linuksowe  wywołanie  systemowe nazywało się sigaction(). Jednak po pojawieniu
       się sygnałów czasu rzeczywistego w Linuksie 2.2, 32-bitowy typ sigset_t o stałym rozmiarze
       obsługiwany przez to wywołanie przestał dobrze służyć swemu zadaniu. Z tego powodu, w celu
       obsługi powiększonego typu sigset_t dodano nowe wywołanie systemowe  rt_sigaction().  Nowe
       wywołanie  przyjmuje  czwarty  argument size_t sigsetsize, który określa rozmiar w bajtach
       zestawu sygnałów w act.sa_mask i oldact.sa_mask. Argument ten obecnie  musi  mieć  wartość
       sizeof(sigset_t) (albo nastąpi błąd EINVAL). Opakowanie glibc sigaction() ukrywa te detale
       przed nami, po cichu wywołując rt_sigaction() jeśli udostępnia je jądro.

   Nieudokumentowane
       Before the introduction of SA_SIGINFO,  it  was  also  possible  to  get  some  additional
       information  about  the  signal.   This was done by providing an sa_handler signal handler
       with a second argument of type struct sigcontext, which is the same structure as  the  one
       that  is  passed  in the uc_mcontext field of the ucontext structure that is passed (via a
       pointer) in the third argument of the sa_sigaction handler.  See the relevant Linux kernel
       sources for details.  This use is obsolete now.

BŁĘDY

       When  delivering  a  signal  with a SA_SIGINFO handler, the kernel does not always provide
       meaningful values for all of the fields of  the  siginfo_t  that  are  relevant  for  that
       signal.

       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ŁADY

       Patrz mprotect(2).

   Probing for flag support
       The  following  example  program  exits  with  status EXIT_SUCCESS if SA_EXPOSE_TAGBITS is
       determined to be supported, and EXIT_FAILURE otherwise.

       #include <signal.h>
       #include <stdlib.h>
       #include <stdio.h>
       #include <unistd.h>

       void
       handler(int signo, siginfo_t *info, void *context)
       {
           struct sigaction oldact;

           if (sigaction(SIGSEGV, NULL, &oldact) == -1 ||
                   (oldact.sa_flags & SA_UNSUPPORTED) ||
                   !(oldact.sa_flags & SA_EXPOSE_TAGBITS)) {
               _exit(EXIT_FAILURE);
           }
           _exit(EXIT_SUCCESS);
       }

       int
       main(void)
       {
           struct sigaction act = { 0 };

           act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS;
           act.sa_sigaction = &handler;
           if (sigaction(SIGSEGV, &act, NULL) == -1) {
               perror("sigaction");
               exit(EXIT_FAILURE);
           }

           raise(SIGSEGV);
       }

ZOBACZ TAKŻE

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

O STRONIE

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

TŁUMACZENIE

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

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.