.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1994,1995 Mike Battersby .\" and Copyright 2004, 2005 Michael Kerrisk .\" 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 .\" 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 .\" SA_ONSTACK .\" Modified 2004-11-11 by Michael Kerrisk .\" Added mention of SIGCONT under SA_NOCLDSTOP .\" Added SA_NOCLDWAIT .\" Modified 2004-11-17 by Michael Kerrisk .\" 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 .\" Added notes on ptrace SIGTRAP and SYS_SECCOMP. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH sigaction 2 "21 sierpnia 2024 r." "Linux man\-pages 6.12" .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 \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\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 POSIX, or \fBsetitimer\fP(2) or \fBalarm\fP(2) timer expired. .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). .P .\" POSIX only guarantees \fBSI_TIMER\fP for signals created by \fItimer_create\fP(2). Implementations are free to also provide it for other types of timers. The Linux behaviour matches NetBSD. .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 When delivering a signal resulting from a hardware exception with a \fBSA_SIGINFO\fP handler, the kernel does not always provide meaningful values for all of the fields of the \fIsiginfo_t\fP that are relevant for that signal. For example, when the x86 \fIint\fP instruction is called with a forbidden argument (any number other than 3 or 128), a \fBSIGSEGV\fP signal is delivered, but the \fIsiginfo_t\fP passed to the signal handler has all its fields besides \fIsi_signo\fP and \fIsi_code\fP set to zero, even if other fields should be set (as an example, \fIsi_addr\fP should be non\-zero for all \fBSIGSEGV\fP signals). .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 #include #include #include \& 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 Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys , Robert Luberda i Michał Kułach . .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 .