.\" -*- coding: UTF-8 -*-
.\" Copyright (c) 1994,1995 Mike Battersby <mib@deakin.edu.au>
.\" and Copyright 2004, 2005 Michael Kerrisk <mtk.manpages@gmail.com>
.\" based on work by faith@cs.unc.edu
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\" Modified, aeb, 960424
.\" Modified Fri Jan 31 17:31:20 1997 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified Thu Nov 26 02:12:45 1998 by aeb - add SIGCHLD stuff.
.\" Modified Sat May  8 17:40:19 1999 by Matthew Wilcox
.\"	add POSIX.1b signals
.\" Modified Sat Dec 29 01:44:52 2001 by Evan Jones <ejones@uwaterloo.ca>
.\"	SA_ONSTACK
.\" Modified 2004-11-11 by Michael Kerrisk <mtk.manpages@gmail.com>
.\"	Added mention of SIGCONT under SA_NOCLDSTOP
.\"	Added SA_NOCLDWAIT
.\" Modified 2004-11-17 by Michael Kerrisk <mtk.manpages@gmail.com>
.\"	Updated discussion for POSIX.1-2001 and SIGCHLD and sa_flags.
.\"	Formatting fixes
.\" 2004-12-09, mtk, added SI_TKILL + other minor changes
.\" 2005-09-15, mtk, split sigpending(), sigprocmask(), sigsuspend()
.\"	out of this page into separate pages.
.\" 2010-06-11 Andi Kleen, add hwpoison signal extensions
.\" 2010-06-11 mtk, improvements to discussion of various siginfo_t fields.
.\" 2015-01-17, Kees Cook <keescook@chromium.org>
.\"	Added notes on ptrace SIGTRAP and SYS_SECCOMP.
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH sigaction 2 "2 maja 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
sigaction, rt_sigaction \- bada i zmienia akcję sygnału
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <signal.h>\fP
.P
\fBint sigaction(int \fP\fIsignum\fP\fB,\fP
\fB              const struct sigaction *_Nullable restrict \fP\fIact\fP\fB,\fP
\fB              struct sigaction *_Nullable restrict \fP\fIoldact\fP\fB);\fP
.fi
.P
.RS -4
Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)):
.RE
.P
\fBsigaction\fP():
.nf
    _POSIX_C_SOURCE
.fi
.P
\fIsiginfo_t\fP:
.nf
    _POSIX_C_SOURCE >= 199309L
.fi
.SH OPIS
Wywołanie systemowe \fBsigaction\fP() 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 \fBsignals\fP(7)).
.P
\fIsignum\fP określa sygnał i może być dowolnym prawidłowym sygnałem poza
\fBSIGKILL\fP i \fBSIGSTOP\fP.
.P
Jeśli \fIact\fP nie jest NULL\-em, to nowa akcja dla sygnału \fIsignum\fP jest
brana z \fIact\fP. Jeśli \fIoldact\fP też jest różny od NULL, to poprzednia akcja
jest w nim zachowywana.
.P
Struktura \fIsigaction\fP jest zdefiniowana jako:
.P
.in +4n
.EX
struct sigaction {
    void     (*sa_handler)(int);
    void     (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer)(void);
};
.EE
.in
.P
Na niektórych architekturach część tej struktury może być unią: nie należy
ustawiać jednocześnie pól \fIsa_handler\fP oraz \fIsa_sigaction\fP.
.P
Pole \fIsa_restorer\fP nie jest przeznaczone do bezpośredniego stosowania
(POSIX nie określa pola \fIsa_restorer\fP). Więcej informacji o przeznaczeniu
tego pola można znaleźć w podręczniku \fBsigreturn\fP(2).
.P
\fIsa_handler\fP określa akcję, jaka ma być powiązana z \fIsignum\fP i może być to
jedna z:
.IP \[bu] 3
\fBSIG_DFL\fP aby uzyskać domyślną akcję.
.IP \[bu]
\fBSIG_IGN\fP aby ignorować ten sygnał.
.IP \[bu]
Wskaźnik do funkcji obsługującej sygnał. Funkcja ta ma tylko jeden argument,
w którym będzie przekazany numer sygnału.
.P
Jeśli w \fIsa_flags\fP poda się \fBSA_SIGINFO\fP, to \fIsa_sigaction\fP (zamiast
\fIsa_handler\fP) będzie określało funkcję obsługi sygnału \fIsignum\fP. Funkcja
ta ma trzy argumenty, opisane poniżej.
.P
\fIsa_mask\fP 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 \fBSA_NODEFER\fP.
.P
\fIsa_flags\fP podaje zbiór znaczników, które modyfikują zachowanie procesu
obsługi sygnałów.  Jest to zbiór wartości połączonych bitowym OR:
.TP 
\fBSA_NOCLDSTOP\fP
Jeśli \fIsignum\fP jest równe \fBSIGCHLD\fP, to nie są odbierane powiadomienia o
zatrzymaniu procesu potomnego (np. gdy potomek otrzyma jeden z \fBSIGSTOP\fP,
\fBSIGTSTP\fP, \fBSIGTTIN\fP lub \fBSIGTTOU\fP) ani o jego wznowieniu (np. po
otrzymaniu \fBSIGCONT\fP) (patrz \fBwait\fP(2)). Znacznik ten ma znaczenie tylko w
przypadku ustawiania funkcji obsługi sygnału \fBSIGCHLD\fP.
.TP 
\fBSA_NOCLDWAIT\fP (od Linuksa 2.6)
.\" To be precise: Linux 2.5.60 -- MTK
Jeśli \fIsignum\fP jest równy \fBSIGCHLD\fP, to potomkowie po swoim zakończeniu
nie zostaną przekształceni w zombie. Patrz także \fBwaitpid\fP(2). Znacznik ma
znaczenie tylko dla ustanawiania funkcji obsługującej sygnał \fBSIGCHLD\fP lub
podczas ustawiania tego sygnału na \fBSIG_DLF\fP.
.IP
Jeśli znacznik \fBSA_NOCLDWAIT\fP jest ustawiony podczas ustanawiania funkcji
obsługującej sygnał \fBSIGCHLD\fP, to POSIX.1 nie określa, czy sygnał
\fBSIGCHLD\fP jest generowany po zakończeniu procesu potomnego. Pod Linuksem
sygnał \fBSIGCHLD\fP jest w takim przypadku generowany; niektóre inne systemy
go nie  generują.
.TP 
\fBSA_NODEFER\fP
Nie dodaje sygnału do maski sygnałów wątku, gdy wykonywana jest funkcja
obsługi sygnału, chyba że w \fIact.sa_mask\fP 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.
.IP
\fBSA_NOMASK\fP jest przestarzałym, niestandardowym synonimem tego znacznika.
.TP 
\fBSA_ONSTACK\fP
Wywołuje funkcję obsługi sygnału, używając alternatywnego stosu ustawionego
przez \fBsigaltstack\fP(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.
.TP 
\fBSA_RESETHAND\fP
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.
.IP
\fBSA_ONESHOT\fP jest przestarzałym, niestandardowym synonimem tego znacznika.
.TP 
\fBSA_RESTART\fP
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 \fBsignal\fP(7).
.TP 
\fBSA_RESTORER\fP
\fINie jest przeznaczone do bezpośredniego stosowania\fP. Znacznik ten jest
używany przez biblioteki C do wskazania, że pole \fIsa_restorer\fP zawiera
adres \[Bq]trampoliny sygnału\[rq]. Więcej szczegółów w podręczniku
\fBsigreturn\fP(2).
.TP 
\fBSA_SIGINFO\fP (od Linuksa 2.2)
.\" (The
.\" .I sa_sigaction
.\" field was added in Linux 2.1.86.)
.\"
Funkcja obsługi sygnałów pobiera trzy argumenty, a nie jeden. W tym
przypadku zamiast ustawiać \fIsa_handler\fP należy ustawić
\fIsa_sigaction\fP. Znacznik ten ma znaczenie tylko w przypadku ustanawiania
funkcji obsługi sygnału.
.TP 
\fBSA_UNSUPPORTED\fP (od Linuksa 5.11)
Używany do dynamicznego sprawdzania obsługiwanych bitów znaczników.
.IP
Jeśli próba zarejestrowania procedury obsługi \[em] z tym znacznikiem
ustawionym w \fIact\->sa_flags\fP wraz z innymi znacznikami, które mogą być
nieobsługiwane przez jądro \[em] powiedzie się, a najbliższe wywołanie
\fBsigaction\fP(), które poda ten sam numer sygnału z argumentem \fIoldact\fP
innym niż NULL spowoduje \fIwyczyszczenie\fP \fBSA_UNSUPPORTED\fP z
\fIoldact\->sa_flags\fP, to \fIoldact\->sa_flags\fP 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 \[Bq]Dynamiczne sprawdzanie obsługiwanych bitów znaczników\[rq]
poniżej.
.TP 
\fBSA_EXPOSE_TAGBITS\fP (od Linuksa 5.11)
Przy dostarczaniu sygnału, zestaw bitów znaczników charakterystycznych dla
architektury jest zwykle czyszczony z pola \fIsi_addr\fP \fIsiginfo_t\fP. Jeśli
ten znacznik jest ustawiony, podzbiór bitów znaczników charakterystycznych
dla architektury zostanie zachowany w \fIsi_addr\fP.
.IP
Programy, które muszą być kompatybilne z wersjami Linuksa starszymi niż
5.11, muszą użyć \fBSA_UNSUPPORTED\fP aby sprawdzić dostępność obsługi tego
znacznika.
.SS "Argument siginfo_t do procedury obsługi SA_SIGINFO"
Gdy w \fIact.sa_flags\fP poda się znacznik \fBSA_SIGINFO\fP, to adres procedury
obsługi sygnału jest przekazywany za pomocą pola \fIact.sa_sigaction\fP. Ta
procedura obsługi przyjmuje trzy argumenty jak poniżej:
.P
.in +4n
.EX
void
handler(int sig, siginfo_t *info, void *ucontext)
{
    ...
}
.EE
.in
.P
Te trzy argumenty to:
.TP 
\fIsig\fP
Numer sygnału powodującego przywołanie procedury obsługi.
.TP 
\fIinfo\fP
Wskaźnik do \fIsiginfo_t\fP, który jest strukturą zawierającą dalsze informacje
o sygnale, jak to opisano poniżej.
.TP 
\fIucontext\fP
Jest to wskaźnik do struktury \fIucontext_t\fP rzutowany na \fIvoid\ *\fP. 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 \fBsigreturn\fP(2). Dalsze informacje o
strukturze \fIucontext_t\fP można odszukać w podręcznikach \fBgetcontext\fP(3) i
\fBsignal\fP(7). Funkcja obsługi nie czyni zwykle żadnego użytku z trzeciego
argumentu.
.P
Typ danych \fIsiginfo_t\fP jest strukturą zawierającą następujące pola:
.P
.in +4n
.EX
.\" FIXME
.\" The siginfo_t 'si_trapno' field seems to be used
.\" only on SPARC and Alpha; this page could use
.\" a little more detail on its purpose there.
.\" In the kernel: si_tid
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ł \fIint\fP 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) */
}
.EE
.in
.P
\fIsi_signo\fP, \fIsi_errno\fP i \fIsi_code\fP są zdefiniowane dla wszystkich
sygnałów. (Generalnie \fIsi_errno\fP nie jest używane pod Linuksem). Pozostałe
pola struktury mogą być unią; powinno się odczytywać tylko pola istotne dla
danego sygnału.
.IP \[bu] 3
Sygnały wysłane przez \fBkill\fP(2) i \fBsigqueue\fP(3) mają wypełnione pola
\fIsi_pid\fP oraz \fIsi_uid\fP. Dodatkowo sygnały wysłane przez \fBsigqueue\fP(3)
mają w polach \fIsi_int\fP i \fIsi_ptr\fP ustawione wartości podane przez nadawcę
sygnału; szczegóły opisano w \fBsigqueue\fP(3).
.IP \[bu]
Sygnały wysłane przez czasomierze POSIX.1b (od Linuksa 2.6) mają uzupełnione
pola \fIsi_overrun\fP i \fIsi_timerid\fP. Pole \fIsi_timerid\fP zawiera wewnętrzny
identyfikator używany przez jądro do identyfikacji czasomierza; nie jest to
ten sam identyfikator, który zwraca \fBtimer_create\fP(2). Pole \fIsi_overrun\fP
zawiera informację o tym, ile razy czasomierz się przepełnił \(em jest to ta
sama informacja, którą zwraca \fBtimer_getoverrun\fP(2). Pola te są
niestandardowymi rozszerzeniami Linuksa.
.IP \[bu]
Sygnały wysłane w celu notyfikacji kolejki komunikatów (patrz opis
\fBSIGEV_SIGNAL\fP in \fBmq_notify\fP(3)) mają pola \fIsi_int\fP/\fIsi_ptr\fP wypełnione
wartościami \fIsigev_value\fP przekazanymi do \fBmq_notify\fP(3); ponadto
\fIsi_pid\fP zawiera identyfikator procesu wysyłającego sygnał, a \fIsi_uid\fP
rzeczywisty identyfikator użytkownika \- nadawcy sygnału.
.IP \[bu]
.\" FIXME .
.\" When si_utime and si_stime where originally implemented, the
.\" measurement unit was HZ, which was the same as clock ticks
.\" (sysconf(_SC_CLK_TCK)).  In Linux 2.6, HZ became configurable, and
.\" was *still* used as the unit to return the info these fields,
.\" with the result that the field values depended on the
.\" configured HZ.  Of course, the should have been measured in
.\" USER_HZ instead, so that sysconf(_SC_CLK_TCK) could be used to
.\" convert to seconds.  I have a queued patch to fix this:
.\" http://thread.gmane.org/gmane.linux.kernel/698061/ .
.\" This patch made it into Linux 2.6.27.
.\" But note that these fields still don't return the times of
.\" waited-for children (as is done by getrusage() and times()
.\" and wait4()).  Solaris 8 does include child times.
\fBSIGCHLD\fP ustawia pola \fIsi_pid\fP, \fIsi_uid\fP, \fIsi_status\fP, \fIsi_utime\fP i
\fIsi_stime\fP, dostarczając informacji o procesie potomnym. Pole \fIsi_pid\fP
jest identyfikatorem potomka, \fIsi_uid\fP jest rzeczywistym identyfikatorem
użytkownika procesu potomnego. Pole \fIsi_status\fP zawiera kod zakończenia
potomka (jeśli \fIsi_code\fP jest równe \fBCLD_EXITED\fP) lub numer sygnału, który
spowodował zmianę stanu. Pola \fIsi_utime\fP i \fIsi_stime\fP zawierają czasy
spędzone przez potomka w przestrzeniach użytkownika i systemowej; w
przeciwieństwie do \fBgetrusage\fP(2) i \fBtimes\fP(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 \fIsysconf(_SC_CLK_TCK)\fP. W Linuksie 2.6
przed Linuksem 2.6.27 z powodu błędu używane były (konfigurowalne) jednostki
jiffy (patrz \fBtime\fP(7)).
.IP \[bu]
\fBSIGILL\fP, \fBSIGFPE\fP, \fBSIGSEGV\fP, \fBSIGBUS\fP oraz \fBSIGTRAP\fP wypełniają pole
\fIsi_addr\fP, ustawiając w nim adres błędu. Na niektórych architekturach
sygnały wypełniają także pole \fIsi_trapno\fP.
.IP
Niektóre błędy pochodne \fBSIGBUS\fP, w szczególności \fBBUS_MCEERR_AO\fP i
\fBBUS_MCEERR_AR\fP ustawiają także \fIsi_addr_lsb\fP. Pole to oznacza najmniej
znaczący bit adresu, zatem i rozmiary uszkodzeń. Na przykład jeśli cała
strona została uszkodzona,  \fIsi_addr_lsb\fP zawierać będzie
\fIlog2(sysconf(_SC_PAGESIZE))\fP. Gdy jako odpowiedź na zdarzenie \fBptrace\fP(2)
(PTRACE_EVENT_foo) zostanie dostarczony \fBSIGTRAP\fP, pole \fIsi_addr\fP nie jest
wypełnione, natomiast pola \fIsi_pid\fP i \fIsi_uid\fP są wypełnione
identyfikatorami odpowiednio procesu i użytkownika odpowiedzialnego za
dostarczenie pułapki. W przypadku \fBseccomp\fP(2) jako dostarczenie zdarzenia
pokazany zostanie zrzut. \fBBUS_MCERR_*\fP i \fIsi_addr_lsb\fP są rozszerzeniami
specyficznymi dla Linuksa.
.IP
\fBSEGV_BNDERR\fP będący podbłędem \fBSIGSEGV\fP wypełnia pola \fIsi_lower\fP i
\fIsi_upper\fP.
.IP
\fBSEGV_PKUERR\fP będący podbłędem \fBSIGSEGV\fP wypełnia pole \fIsi_pkey\fP.
.IP \[bu]
\fBSIGIO\fP/\fBSIGPOLL\fP (te dwie nazwy są synonimami pod Linuksem) wypełnia pola
\fIsi_band\fP i \fIsi_fd\fP.  Zdarzenie \fIsi_band\fP jest maską bitową zawierającą
te same wartości, które \fBpoll\fP(2) umieszcza w polu \fIrevents\fP. Pole
\fIsi_fd\fP oznacza deskryptor pliku, na którym wystąpiło dane zdarzenie
wejścia/wyjścia; więcej szczegółów w opisie \fBF_SETSIG\fP w podręczniku
\fBfcntl\fP(2).
.IP \[bu]
.\" commit a0727e8ce513fe6890416da960181ceb10fbfae6
.\"
\fBSIGSYS\fP, generowany (od Linuksa 3.5) gdy filtr seccomp zwróci
\fBSECCOMP_RET_TRAP\fP, wypełnia pola \fIsi_call_addr\fP, \fIsi_syscall\fP,
\fIsi_arch\fP, \fIsi_errno\fP i inne, zgodnie z opisem z \fBseccomp\fP(2).
.SS "Pole si_code"
Pole \fIsi_code\fP, wewnątrz argumentu \fIsiginfo_t\fP, które jest przekazywane do
procedury obsługi sygnału \fBSA_SIGINFO\fP, jest wartością (a nie maską bitową)
określającą powód wysłania sygnału. Dla zdarzenia \fBptrace\fP(2), pole
\fBsi_code\fP będzie zawierać \fBSIGTRAP\fP i mieć zdarzenie ptrace w najwyższym
bajcie:
.P
.in +4n
.EX
(SIGTRAP | PTRACE_EVENT_foo << 8).
.EE
.in
.P
Dla zdarzeń innych niż \fBptrace\fP(2), wartości jakie mogą wystąpić w
\fIsi_code\fP są opisane w pozostałej części niniejszego rozdziału. Od glibc
2.20, definicje większości z tych symboli są pozyskiwane z
\fI<signal.h>\fP za pomocą definicji makr testowania cech (przed
włączeniem \fIjakiegokolwiek\fP pliku nagłówkowego), jak poniżej:
.IP \[bu] 3
\fB_XOPEN_SOURCE\fP z wartością 500 lub większą;
.IP \[bu]
\fB_XOPEN_SOURCE\fP i \fB_XOPEN_SOURCE_EXTENDED\fP; albo
.IP \[bu]
\fB_POSIX_C_SOURCE\fP z wartością 200809L lub większą.
.P
Dla stałych \fBTRAP_*\fP, definicje symboli są zapewnione jedynie w dwóch
pierwszych przypadkach. Przed glibc 2.20, nie było konieczne ustawianie
makr, do pozyskania tych symboli.
.P
W przypadku zwykłego sygnału, poniżej zestawiono wartości, które mogą
występować w \fIsi_code\fP dowolnego sygnału razem z powodami, dla których
sygnał był wygenerowany.
.RS 4
.TP 
\fBSI_USER\fP
\fBkill\fP(2).
.TP 
\fBSI_KERNEL\fP
Wysyłany przez jądro.
.TP 
\fBSI_QUEUE\fP
\fBsigqueue\fP(3).
.TP 
\fBSI_TIMER\fP
Wygaśnięcie czasomierza POSIX.
.TP 
\fBSI_MESGQ\fP (od Linuksa 2.6.6)
Zmiana stanu kolejki komunikatów POSIX; patrz \fBmq_notify\fP(3)
.TP 
\fBSI_ASYNCIO\fP
Ukończenie asynchronicznej operacji wejścia/wyjścia.
.TP 
\fBSI_SIGIO\fP
Kolejkowany \fBSIGIO\fP (tylko do Linuksa 2.2; od Linuksa 2.4
\fBSIGIO\fP/\fBSIGPOLL\fP wypełniają \fIsi_code\fP, tak jak to opisano poniżej).
.TP 
\fBSI_TKILL\fP (od Linuksa 2.4.19)
.\" SI_DETHREAD is defined in Linux 2.6.9 sources, but isn't implemented
.\" It appears to have been an idea that was tried during 2.5.6
.\" through to Linux 2.5.24 and then was backed out.
\fBtkill\fP(2) lub \fBtgkill\fP(2)
.RE
.P
Następujące wartości mogą zostać umieszczone w \fIsi_code\fP sygnału \fBSIGILL\fP:
.RS 4
.TP 
\fBILL_ILLOPC\fP
Niedozwolony kod operacji.
.TP 
\fBILL_ILLOPN\fP
Niedozwolony operand.
.TP 
\fBILL_ILLADR\fP
Niedozwolony tryb adresowania.
.TP 
\fBILL_ILLTRP\fP
Niedozwolona pułapka.
.TP 
\fBILL_PRVOPC\fP
Uprzywilejowany kod operacji.
.TP 
\fBILL_PRVREG\fP
Uprzywilejowany rejestr.
.TP 
\fBILL_COPROC\fP
Błąd koprocesora.
.TP 
\fBILL_BADSTK\fP
Wewnętrzny błąd stosu.
.RE
.P
Następujące wartości mogą zostać umieszczone w \fIsi_code\fP sygnału \fBSIGFPE\fP:
.RS 4
.TP 
\fBFPE_INTDIV\fP
Dzielenie wartości całkowitej przez zero.
.TP 
\fBFPE_INTOVF\fP
Przepełnienie liczby całkowitej.
.TP 
\fBFPE_FLTDIV\fP
Dzielenie wartości zmiennoprzecinkowej przez zero.
.TP 
\fBFPE_FLTOVF\fP
Przekroczenie zakresu operacji zmiennoprzecinkowej.
.TP 
\fBFPE_FLTUND\fP
Przekroczenie (w dół) zakresu operacji zmiennoprzecinkowej.
.TP 
\fBFPE_FLTRES\fP
Niedokładny wynik operacji zmiennoprzecinkowej.
.TP 
\fBFPE_FLTINV\fP
Niepoprawna operacja zmiennoprzecinkowa.
.TP 
\fBFPE_FLTSUB\fP
Dolny indeks poza zakresem.
.RE
.P
Następujące wartości mogą zostać umieszczone w \fIsi_code\fP sygnału
\fBSIGSEGV\fP:
.RS 4
.TP 
\fBSEGV_MAPERR\fP
Adres niemapowany do obiektu.
.TP 
\fBSEGV_ACCERR\fP
Niepoprawne uprawnienia mapowanego obiektu.
.TP 
\fBSEGV_BNDERR\fP (od Linuksa 3.19)
.\" commit ee1b58d36aa1b5a79eaba11f5c3633c88231da83
Niepowodzenie sprawdzenia przypisania adresu.
.TP 
\fBSEGV_PKUERR\fP (od Linuksa 4.6)
.\" commit cd0ea35ff5511cde299a61c21a95889b4a71464e
Dostęp został odmówiony przez klucze zabezpieczeń
pamięci. Zob. \fBpkeys\fP(7). Klucz zabezpieczeń, jaki zastosowano do tego
dostępu jest dostępny za pomocą \fIsi_pkey\fP.
.RE
.P
Następujące wartości mogą zostać umieszczone w \fIsi_code\fP sygnału \fBSIGBUS\fP:
.RS 4
.TP 
\fBBUS_ADRALN\fP
Niepoprawne wyrównanie adresu.
.TP 
\fBBUS_ADRERR\fP
Nieistniejący adres fizyczny.
.TP 
\fBBUS_OBJERR\fP
Błąd sprzętowy specyficzny dla obiektu.
.TP 
\fBBUS_MCEERR_AR\fP (od Linuksa 2.6.32)
Sprzętowy błąd pamięci podczas sprawdzania komputera; wymagane podjęcie
akcji.
.TP 
\fBBUS_MCEERR_AO\fP (od Linuksa 2.6.32)
Wykryto sprzętowy błąd pamięci w procesie; opcjonalne podjęcie akcji.
.RE
.P
Następujące wartości mogą zostać umieszczone w \fIsi_code\fP sygnału
\fBSIGTRAP\fP:
.RS 4
.TP 
\fBTRAP_BRKPT\fP
Punkt wstrzymania procesu.
.TP 
\fBTRAP_TRACE\fP
Śledzony proces złapany.
.TP 
\fBTRAP_BRANCH\fP (od Linuksa 2.4, tylko IA64)
Śledzone rozgałęzienie procesu złapane.
.TP 
\fBTRAP_HWBKPT\fP (od Linuksa 2.4, tylko IA64)
Pułapka sprzętowa.
.RE
.P
Następujące wartości mogą zostać umieszczone w \fIsi_code\fP sygnału
\fBSIGCHLD\fP:
.RS 4
.TP 
\fBCLD_EXITED\fP
Proces potomny się zakończył.
.TP 
\fBCLD_KILLED\fP
Proces potomny został zabity.
.TP 
\fBCLD_DUMPED\fP
Potomek zakończył się w nieprawidłowy sposób.
.TP 
\fBCLD_TRAPPED\fP
Śledzony potomek został złapany.
.TP 
\fBCLD_STOPPED\fP
Proces potomny został zatrzymany.
.TP 
\fBCLD_CONTINUED\fP (od Linuksa 2.6.9)
Zatrzymany proces potomny został wznowiony.
.RE
.P
Następujące wartości mogą zostać umieszczone w \fIsi_code\fP sygnału
\fBSIGIO\fP/\fBSIGPOLL\fP:
.RS 4
.TP 
\fBPOLL_IN\fP
Dostępne dane na wejściu.
.TP 
\fBPOLL_OUT\fP
Dostępne bufory wyjścia.
.TP 
\fBPOLL_MSG\fP
Dostępna wiadomość na wejściu.
.TP 
\fBPOLL_ERR\fP
Błąd wejścia/wyjścia.
.TP 
\fBPOLL_PRI\fP
Dostępne wejście o wysokim priorytecie.
.TP 
\fBPOLL_HUP\fP
Urządzenie odłączone.
.RE
.P
Następująca wartość może zostać umieszczona w \fIsi_code\fP sygnału \fBSIGSYS\fP:
.RS 4
.TP 
\fBSYS_SECCOMP\fP (od Linuksa 3.5)
Wyzwolone przez regułę filtra \fBseccomp\fP(2).
.RE
.SS "Dynamiczne sprawdzanie obsługiwanych bitów znaczników"
Wywołanie \fBsigaction\fP() w Linuksie akceptuje nieznane bity ustawione w
\fIact\->sa_flags\fP nie zgłaszając błędu. Zachowanie jądra, od Linuksa 5.11
jest takie, że drugie \fBsigaction\fP() wyczyści nieznane bity z
\fIoldact\->sa_flags\fP. Jednak historycznie, drugie wywołanie zwykle
pozostawiało te bity ustawione w \fIoldact\->sa_flags\fP.
.P
Oznacza to, że nie da się wykryć obsługi nowych znaczników jedynie
sprawdzając znacznik w \fIsa_flags\fP, lecz konieczne jest sprawdzenie, czy
\fBSA_UNSUPPORTED\fP zostało wyczyszczone, przed poleganiem na zawartości
\fIsa_flags\fP.
.P
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 \[em] tam, gdzie nie jest to możliwe, np. gdy sygnał jest
asynchroniczny \[em] wywołać \fBsigaction\fP() po raz drugi z samej procedury
obsługi sygnału.
.P
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
\fIact\->sa_flags\fP.
.P
Znaczników \fBSA_NOCLDSTOP\fP, \fBSA_NOCLDWAIT\fP, \fBSA_SIGINFO\fP, \fBSA_ONSTACK\fP,
\fBSA_RESTART\fP, \fBSA_NODEFER\fP, \fBSA_RESETHAND\fP i, jeśli jest zdefiniowany na
danej architekturze, \fBSA_RESTORER\fP 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.
.P
W rozdziale PRZYKŁADY poniżej, zademonstrowano korzystanie z
\fBSA_UNSUPPORTED\fP.
.SH "WARTOŚĆ ZWRACANA"
\fBsigaction\fP() w przypadku powodzenia zwraca 0. W razie wystąpienia błędu
zwracane jest \-1 i ustawiana jest zmienna \fIerrno\fP wskazując na błąd.
.SH BŁĘDY
.TP 
\fBEFAULT\fP
\fIact\fP lub \fIoldact\fP wskazują na pamięć poza przestrzenią adresową procesu.
.TP 
\fBEINVAL\fP
Podano nieprawidłowy sygnał. Będzie to też generowane w przypadku próby
zmienienia akcji dla sygnałów \fBSIGKILL\fP lub \fBSIGSTOP\fP, które nie mogą być
przechwycone lub zignorowane.
.SH WERSJE
.SS "Różnice biblioteki C/jądra"
Funkcja opakowująca glibc dla \fBsigaction\fP() daje błąd (\fBEINVAL\fP) 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 \fBnptl\fP(7).
.P
Na architekturach, na których trampolina sygnału jest zawarta w bibliotece
C, funkcja opakowujące \fBsigaction\fP() z glibc, umieszcza adres kodu
trampoliny w polu \fIact.sa_restorer\fP i ustawia znacznik \fBSA_RESTORER\fP w
polu \fIact.sa_flags\fP. Zob. \fBsigreturn\fP(2).
.P
Oryginalne linuksowe wywołanie systemowe nazywało się \fBsigaction\fP(). Jednak
po pojawieniu się sygnałów czasu rzeczywistego w Linuksie 2.2, 32\-bitowy typ
\fIsigset_t\fP 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 \fIsigset_t\fP dodano nowe wywołanie systemowe \fBrt_sigaction\fP(). Nowe
wywołanie przyjmuje czwarty argument \fIsize_t sigsetsize\fP, który określa
rozmiar w bajtach zestawu sygnałów w \fIact.sa_mask\fP i
\fIoldact.sa_mask\fP. Argument ten obecnie musi mieć wartość
\fIsizeof(sigset_t)\fP (albo nastąpi błąd \fBEINVAL\fP). Opakowanie glibc
\fBsigaction\fP() ukrywa te detale przed nami, po cichu wywołując
\fBrt_sigaction\fP() jeśli udostępnia je jądro.
.SH STANDARDY
POSIX.1\-2008.
.SH HISTORIA
.\" SVr4 does not document the EINTR condition.
POSIX.1\-2001, SVr4.
.P
POSIX.1\-1990 zabraniał ustawiania akcji dla \fBSIGCHLD\fP na
\fBSIG_IGN\fP. POSIX.1\-2001 i późniejsze pozwalają na to, tak że można użyć
ignorowania \fBSIGCHLD\fP, żeby zapobiec tworzeniu procesów zombie (patrz
\fBwait\fP(2)). Niemniej jednak, historyczne zachowanie systemów BSD i System\ V w zakresie ignorowania \fBSIGCHLD\fP 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 \fBSIGCHLD\fP i wywołanie funkcji
\fBwait\fP(2) lub podobnej.
.P
POSIX.1\-1990 określał tylko \fBSA_NOCLDSTOP\fP. W POSIX.1\-2001 dodano
\fBSA_NOCLDWAIT\fP, \fBSA_NODEFER\fP, \fBSA_ONSTACK\fP, \fBSA_RESETHAND\fP,
\fBSA_RESTART\fP i \fBSA_SIGINFO\fP jako rozszerzenia XSI. POSIX.1\-2008 przeniósł
\fBSA_NODEFER\fP, \fBSA_RESETHAND\fP, \fBSA_RESTART\fP i \fBSA_SIGINFO\fP do głównej
normy. Używanie tych nowych wartości \fIsa_flags\fP może być mniej przenośne w
aplikacjach przewidzianych do użycia w starszych implementacjach Uniksa.
.P
Znacznik \fBSA_RESETHAND\fP jest kompatybilny ze znacznikiem w SVr4 o tej samej
nazwie.
.P
Znacznik \fBSA_NODEFER\fP 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 \fIsa_mask\fP).
.SH UWAGI
Potomek utworzony przez \fBfork\fP(2) dziedziczy kopię ustawień sygnałów od
swojego rodzica. Podczas wywołania \fBexecve\fP(2) przywracane są wartości
domyślne ustawień, z wyjątkiem ustawienia ignorowania sygnału, które nie
jest zmieniane.
.P
Zgodnie z POSIX, zachowanie procesu po zignorowaniu sygnału \fBSIGFPE\fP,
\fBSIGILL\fP lub \fBSIGSEGV\fP, niewygenerowanego przez \fBkill\fP(2) lub
\fBraise\fP(3), jest niezdefiniowane. Dzielenie liczby całkowitej przez zero ma
wynik niezdefiniowany. Na niektórych architekturach generuje sygnał
\fBSIGFPE\fP (także dzielenie najmniejszej ujemnej liczby całkowitej przez \-1
może wygenerować \fBSIGFPE\fP). Ignorowanie go może prowadzić do nieskończonej
pętli.
.P
\fBsigaction\fP() 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.
.P
Nie można zablokować sygnałów \fBSIGKILL\fP lub \fBSIGSTOP\fP (przez podanie ich w
\fIsa_mask\fP). Próby takie zostaną zignorowane.
.P
Zobacz \fBsigsetops\fP(3)  dla szczegółów o operacjach na zbiorach sygnałów.
.P
.\"
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 \fBsignal\-safety\fP(7).
.SS Nieudokumentowane
Przed wprowadzeniem \fBSA_SIGINFO\fP również było możliwe otrzymanie pewnych
dodatkowych informacji o sygnale. Działo się to poprzez użycie procedury
obsługi sygnału \fIsa_handler\fP z drugim argumentem, będącym typu \fIstruct sigcontext\fP, który jest taką samą strukturą jak ta przekazywana w polu
\fIuc_mcontext\fP struktury \fIucontext\fP, przekazywanym (wskaźnikiem) w trzecim
argumencie procedury obsługi \fIsa_sigaction\fP. Szczegóły można znaleźć w
odpowiednich źródłach jądra Linux. To użycie jest obecnie przestarzałe.
.SH USTERKI
Przy dostarczaniu sygnału za pomocą procedury obsługi \fBSA_SIGINFO\fP, jądro
nie zawsze dostarcza przydatnych wartości we wszystkich polach \fIsiginfo_t\fP,
które są istotne dla danego sygnału.
.P
.\" commit 69be8f189653cd81aae5a74e26615b12871bb72e
Do Linuksa 2.6.13 włącznie, podanie \fBSA_NODEFER\fP w \fIsa_flags\fP zapobiegało
maskowaniu nie tylko dostarczonego sygnału podczas wykonywania procedury
obsługi sygnału, ale także sygnałów określonych w \fIsa_mask\fP. Ten błąd
został poprawiony w Linuksie 2.6.14.
.SH PRZYKŁADY
Patrz \fBmprotect\fP(2).
.SS "Sprawdzanie obsługiwanych znaczników"
Poniższy przykładowy program wychodzi ze statusem \fBEXIT_SUCCESS\fP gdy
sprawdzi, że \fBSA_EXPOSE_TAGBITS\fP jest obsługiwany albo \fBEXIT_FAILURE\fP w
przeciwnym przypadku.
.P
.\" SRC BEGIN (sigaction.c)
.EX
#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);
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fBkill\fP(1), \fBkill\fP(2), \fBpause\fP(2), \fBpidfd_send_signal\fP(2),
\fBrestart_syscall\fP(2), \fBseccomp\fP(2), \fBsigaltstack\fP(2), \fBsignal\fP(2),
\fBsignalfd\fP(2), \fBsigpending\fP(2), \fBsigprocmask\fP(2), \fBsigreturn\fP(2),
\fBsigsuspend\fP(2), \fBwait\fP(2), \fBkillpg\fP(3), \fBraise\fP(3), \fBsiginterrupt\fP(3),
\fBsigqueue\fP(3), \fBsigsetops\fP(3), \fBsigvec\fP(3), \fBcore\fP(5), \fBsignal\fP(7)
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Przemek Borys <pborys@dione.ids.pl>,
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
