Provided by: manpages-pl-dev_4.21.0-2_all 

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ą 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 can 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; /* 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 zużyty w przestrzeni użytkownika */
clock_t si_stime; /* Czas zuż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. timerów; timery POSIX.1b */
int si_timerid; /* ID timera; timery POSIX.1b */
void *si_addr; /* Adres pamięci powodujący błąd */
long si_band; /* Grupa zdarzenia (był int w
glibc 2.3.2 i wcześniejszych) */
int si_fd; /* Deskryptor pliku */
short si_addr_lsb; /* Mniej istotny bit adresu
(od Linuksa 2.6.32) */
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 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 fills in si_pid, si_uid, si_status, si_utime, and si_stime, providing information about the
child. The si_pid field is the process ID of the child; si_uid is the child's real user ID. The
si_status field contains the exit status of the child (if si_code is CLD_EXITED), or the signal number
that caused the process to change state. The si_utime and si_stime contain the user and system CPU
time used by the child process; these fields do not include the times used by waited-for children
(unlike getrusage(2) and times(2)). Up to Linux 2.6, and since Linux 2.6.27, these fields report CPU
time in units of sysconf(_SC_CLK_TCK). In Linux 2.6 kernels before Linux 2.6.27, a bug meant that
these fields reported time in units of the (configurable) system jiffy (see 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.
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 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
Queued SIGIO (only up to Linux 2.2; from Linux 2.4 onward SIGIO/SIGPOLL fills in si_code as
described below).
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.
STANDARDY
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.
Up to and including Linux 2.6.13, specifying SA_NODEFER in sa_flags prevents not only the delivered
signal from being masked during execution of the handler, but also the signals specified in sa_mask.
This bug was fixed in Linux 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 <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 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.
Linux man-pages 6.03 10 lutego 2023 r. sigaction(2)