Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

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

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <signal.h>

       int sigaction(int signum,
                     const struct sigaction *_Nullable restrict act,
                     struct sigaction *_Nullable 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ą wykonuje 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 określa akcję, jaka ma być powiązana z signum i może być to jedna z:

       •  SIG_DFL aby uzyskać domyślną akcję.

       •  SIG_IGN aby ignorować ten sygnał.

       •  Wskaźnik  do  funkcji obsługującej sygnał. Funkcja ta ma tylko jeden argument, w którym
          będzie przekazany numer sygnału.

       Jeśli w  sa_flags  poda  się  SA_SIGINFO,  to  sa_sigaction  (zamiast  sa_handler)  będzie
       określało funkcję obsługi sygnału signum. Funkcja ta ma trzy argumenty, opisane poniżej.

       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
       znacznika SA_NODEFER.

       sa_flags podaje zbiór znaczników, 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 potomnego (np. gdy potomek otrzyma jeden z SIGSTOP,  SIGTSTP,  SIGTTIN  lub
              SIGTTOU)  ani  o  jego  wznowieniu  (np.  po  otrzymaniu  SIGCONT) (patrz wait(2)).
              Znacznik ten 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 potomkowie po swoim zakończeniu nie zostaną
              przekształceni w zombie. Patrz także waitpid(2). Znacznik ma  znaczenie  tylko  dla
              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 jest
              generowany po zakończeniu procesu potomnego. Pod Linuksem  sygnał  SIGCHLD  jest  w
              takim przypadku generowany; niektóre inne systemy go nie  generują.

       SA_NODEFER
              Nie  dodaje  sygnału  do  maski sygnałów wątku, gdy wykonywana jest funkcja obsługi
              sygnału, chyba że w act.sa_mask podano sygnał.  Kolejne  wystąpienie  sygnału  może
              zatem  być  dostarczone  do  wątku,  w  czasie wykonywania funkcji obsługi sygnału.
              Znacznik ten ma znaczenie tylko w przypadku ustanawiania funkcji 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. Znacznik ten 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.
              Znacznik ten ma znaczenie tylko w przypadku ustanawiania funkcji obsługi sygnału.

              SA_ONESHOT jest przestarzałym, niestandardowym synonimem tego znacznika.

       SA_RESTART
              Dostarcza zachowania  kompatybilnego  z  semantyką  sygnałową  BSD,  czyniąc  pewne
              wywołania  systemowe odtwarzalnymi przez sygnały. Znacznik ten 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. Znacznik ten jest używany 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 tym przypadku
              zamiast ustawiać sa_handler należy ustawić sa_sigaction. Znacznik ten ma  znaczenie
              tylko w przypadku ustanawiania funkcji obsługi sygnału.

       SA_UNSUPPORTED (od Linuksa 5.11)
              Używany do dynamicznego sprawdzania obsługiwanych bitów znaczników.

              Jeśli  próba  zarejestrowania  procedury  obsługi  — z tym znacznikiem ustawionym w
              act->sa_flags wraz z innymi znacznikami, które mogą być nieobsługiwane przez  jądro
              —  powiedzie  się,  a  najbliższe  wywołanie  sigaction(), które poda ten sam numer
              sygnału z argumentem oldact innym niż NULL spowoduje wyczyszczenie SA_UNSUPPORTED z
              oldact->sa_flags,  to  oldact->sa_flags  można  użyć  jako  mapy bitowej znaczników
              wskazującej, które z potencjalnie nieobsługiwanych znaczników są  w  rzeczywistości
              obsługiwane.  Więcej  informacji  znajduje  się w rozdziale „Dynamiczne sprawdzanie
              obsługiwanych bitów znaczników” poniżej.

       SA_EXPOSE_TAGBITS (od Linuksa 5.11)
              Przy  dostarczaniu  sygnału,  zestaw  bitów  znaczników   charakterystycznych   dla
              architektury  jest  zwykle  czyszczony z pola si_addr siginfo_t. Jeśli ten znacznik
              jest ustawiony, podzbiór  bitów  znaczników  charakterystycznych  dla  architektury
              zostanie zachowany w si_addr.

              Programy, które muszą być kompatybilne z wersjami Linuksa starszymi niż 5.11, muszą
              użyć SA_UNSUPPORTED aby sprawdzić dostępność obsługi tego znacznika.

   Argument siginfo_t do procedury obsługi SA_SIGINFO
       Gdy w act.sa_flags poda się znacznik SA_SIGINFO, to adres procedury obsługi  sygnału  jest
       przekazywany  za  pomocą  pola  act.sa_sigaction.  Ta  procedura  obsługi  przyjmuje  trzy
       argumenty jak poniżej:

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

       Te trzy argumenty to:

       sig    Numer sygnału powodującego przywołanie procedury obsługi.

       info   Wskaźnik do  siginfo_t,  który  jest  strukturą  zawierającą  dalsze  informacje  o
              sygnale, jak to opisano poniżej.

       ucontext
              Jest  to  wskaźnik do struktury ucontext_t rzutowany na void *. Struktura, na którą
              wskazuje to pole zawiera informacje o kontekście sygnału, które zostały  zachowanie
              w  stosie  w  przestrzeni  użytkownika przez jądro; więcej szczegółów w podręczniku
              sigreturn(2).  Dalsze  informacje  o  strukturze  ucontext_t   można   odszukać   w
              podręcznikach  getcontext(3)  i signal(7). Funkcja obsługi nie czyni zwykle żadnego
              użytku z trzeciego argumentu.

       Typ danych siginfo_t jest strukturą zawierającą następujące pola:

           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żytk. procesu wysyłającego */
               int      si_status;   /* Kod lub sygnał zakończenia */
               clock_t  si_utime;    /* Czas użyty w przestrzeni użytkownika */
               clock_t  si_stime;    /* Czas użyty przez system operacyjny */
               union sigval si_value;  /* Wartość sygnału */
               int      si_int;      /* Sygnał POSIX.1b */
               void    *si_ptr;      /* Sygnał POSIX.1b */
               int      si_overrun;  /* Licznik przekr. czasom.; czasom POSIX.1b */
               int      si_timerid;  /* ID czasomierza; czasom. 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; /* Najmniej znaczący bit adresu
                                        (od Linuksa 2.6.32) */
               void    *si_lower;    /* Kres dolny przy wystąpieniu naruszenia
                                        adresu (od Linuksa 3.19) */
               void    *si_upper;    /* Kres górny przy wystąpieniu naruszenia
                                        adresu (od Linuksa 3.19) */
               int      si_pkey;     /* Klucz zabezpieczający na PTE będący powodem
                                        błędu (od Linuksa 4.6) */
               void    *si_call_addr;/* Adres instrukcji wywołania systemowego
                                        (od Linuksa 3.5) */
               int      si_syscall;  /* Liczba próbowanych wywołań systemowych
                                        (od Linuksa 3.5) */
               unsigned int si_arch; /* Architektura próbowanego wywoł. systemowego
                                        (od Linuksa 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 czasomierze 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 czasomierza; nie jest to ten  sam  identyfikator,  który  zwraca
          timer_create(2).  Pole  si_overrun  zawiera  informację  o tym, ile razy czasomierz 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
          rzeczywistym identyfikatorem 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. Do Linuksa 2.6 oraz  od
          Linuksa  2.6.27, pola zawierają czas CPU w jednostkach sysconf(_SC_CLK_TCK). W Linuksie
          2.6 przed Linuksem 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).

   Pole si_code
       Pole si_code, wewnątrz argumentu siginfo_t, które jest przekazywane do  procedury  obsługi
       sygnału  SA_SIGINFO,  jest  wartością  (a  nie  maską  bitową)  określającą powód wysłania
       sygnału. Dla zdarzenia ptrace(2), pole si_code będzie zawierać SIGTRAP  i  mieć  zdarzenie
       ptrace w najwyższym bajcie:

           (SIGTRAP | PTRACE_EVENT_foo << 8).

       Dla  zdarzeń  innych  niż  ptrace(2),  wartości jakie mogą wystąpić w si_code są opisane w
       pozostałej części niniejszego rozdziału.  Od  glibc  2.20,  definicje  większości  z  tych
       symboli  są  pozyskiwane  z  <signal.h>  za  pomocą  definicji makr testowania cech (przed
       włączeniem jakiegokolwiek pliku nagłówkowego), jak poniżej:

       •  _XOPEN_SOURCE z wartością 500 lub większą;

       •  _XOPEN_SOURCE i _XOPEN_SOURCE_EXTENDED; albo

       •  _POSIX_C_SOURCE z wartością 200809L lub większą.

       Dla  stałych  TRAP_*,  definicje  symboli  są  zapewnione  jedynie  w   dwóch   pierwszych
       przypadkach.  Przed  glibc  2.20,  nie  było konieczne ustawianie makr, do pozyskania tych
       symboli.

       W przypadku zwykłego 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 czasomierza 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  do  Linuksa  2.2;  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)
                  Dostęp został odmówiony przez klucze zabezpieczeń pamięci. Zob. pkeys(7). Klucz
                  zabezpieczeń, jaki zastosowano do tego dostępu jest dostępny za pomocą 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).

   Dynamiczne sprawdzanie obsługiwanych bitów znaczników
       Wywołanie  sigaction()  w  Linuksie  akceptuje nieznane bity ustawione w act->sa_flags nie
       zgłaszając błędu. Zachowanie jądra, od Linuksa 5.11  jest  takie,  że  drugie  sigaction()
       wyczyści  nieznane  bity  z oldact->sa_flags. Jednak historycznie, drugie wywołanie zwykle
       pozostawiało te bity ustawione w oldact->sa_flags.

       Oznacza to, że nie da się wykryć obsługi nowych znaczników jedynie sprawdzając znacznik  w
       sa_flags,  lecz konieczne jest sprawdzenie, czy SA_UNSUPPORTED zostało wyczyszczone, przed
       poleganiem na zawartości sa_flags.

       Ponieważ zachowania procedury obsługi sygnału nie można zagwarantować, jeśli nie  dokonano
       sprawdzenia, powinno się albo blokować dany sygnał podczas rejestrowania procedury obsługi
       i wykonać w takim przypadku sprawdzenie, albo — tam, gdzie nie jest to  możliwe,  np.  gdy
       sygnał  jest  asynchroniczny  — wywołać sigaction() po raz drugi z samej procedury obsługi
       sygnału.

       W jądrach nieobsługujących danego znacznika, jądro zachowa się tak, jakby znacznik ten nie
       był ustawiony, nawet jeśli znacznik był ustawiony w act->sa_flags.

       Znaczników  SA_NOCLDSTOP,  SA_NOCLDWAIT,  SA_SIGINFO,  SA_ONSTACK, SA_RESTART, SA_NODEFER,
       SA_RESETHAND i, jeśli jest zdefiniowany na danej architekturze,  SA_RESTORER  nie  da  się
       wiarygodnie  sprawdzić  za pomocą opisywanego mechanizmu, ponieważ zostały one wprowadzone
       przez Linuksem 5.11. Zwykle jednak, programy mogą przyjąć, że znaczniki te są obsługiwane,
       ponieważ wszystkie były obsługiwane już od Linuksa 2.6, wydanego w roku 2003.

       W rozdziale PRZYKŁADY poniżej, zademonstrowano korzystanie z 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.

WERSJE

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

       Na architekturach, na których trampolina sygnału jest  zawarta  w  bibliotece  C,  funkcja
       opakowujące  sigaction() z glibc, umieszcza adres kodu trampoliny w polu act.sa_restorer i
       ustawia znacznik SA_RESTORER w polu act.sa_flags. Zob. 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.

STANDARDY

       POSIX.1-2008.

HISTORIA

       POSIX.1-2001, SVr4.

       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
       zombie  (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 zombie 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_NODEFER,
       SA_ONSTACK,  SA_RESETHAND,  SA_RESTART  i  SA_SIGINFO  jako rozszerzenia XSI. POSIX.1-2008
       przeniósł SA_NODEFER, SA_RESETHAND, SA_RESTART i SA_SIGINFO  do  głównej  normy.  Używanie
       tych  nowych  wartości  sa_flags  może być mniej przenośne w aplikacjach przewidzianych do
       użycia w starszych implementacjach Uniksa.

       Znacznik SA_RESETHAND jest kompatybilny ze znacznikiem w SVr4 o tej samej nazwie.

       Znacznik SA_NODEFER jest kompatybilny z podobnym znacznikiem z SVr4 dla  Linuksa  1.3.9  i
       nowszych.  Na  starszych  jądrach  implementacja Linuksa pozwalała na otrzymanie dowolnego
       sygnału, nie tylko tego instalowanego (w praktyce przesłaniając ustawienie sa_mask).

UWAGI

       Potomek utworzony 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.

       sigaction() może być wywoływany z drugim argumentem  o  wartości  NULL,  powodując  w  ten
       sposób zapytanie o bieżącą procedurę obsługi 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 są async-signal-safe i można  je  bezpiecznie  wywołać  w  procedurze
       obsługi sygnału, można znaleźć w podręczniku signal-safety(7).

   Nieudokumentowane
       Przed  wprowadzeniem  SA_SIGINFO  również  było  możliwe  otrzymanie  pewnych  dodatkowych
       informacji o sygnale. Działo się to poprzez użycie procedury obsługi sygnału sa_handler  z
       drugim  argumentem,  będącym typu struct sigcontext, który jest taką samą strukturą jak ta
       przekazywana w polu uc_mcontext struktury ucontext, przekazywanym (wskaźnikiem) w  trzecim
       argumencie procedury obsługi sa_sigaction. Szczegóły można znaleźć w odpowiednich źródłach
       jądra Linux. To użycie jest obecnie przestarzałe.

USTERKI

       Przy dostarczaniu sygnału  za  pomocą  procedury  obsługi  SA_SIGINFO,  jądro  nie  zawsze
       dostarcza przydatnych wartości we wszystkich polach siginfo_t, które są istotne dla danego
       sygnału.

       Do Linuksa 2.6.13 włącznie, 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 Linuksie 2.6.14.

PRZYKŁADY

       Patrz mprotect(2).

   Sprawdzanie obsługiwanych znaczników
       Poniższy  przykładowy  program  wychodzi  ze  statusem  EXIT_SUCCESS  gdy   sprawdzi,   że
       SA_EXPOSE_TAGBITS jest obsługiwany albo EXIT_FAILURE w przeciwnym przypadku.

       #include <signal.h>
       #include <stdio.h>
       #include <stdlib.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)

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⟩.