sigaction(2) System Calls Manual sigaction(2) NAZWA sigaction, rt_sigaction - bada i zmienia akcje sygnalu BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include 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 Wywolanie systemowe sigaction() jest uzywane do zmieniania akcji, ktora odbiera proces po odebraniu okreslonego sygnalu. (Wprowadzenie do sygnalow mozna znalezc w podreczniku signals(7)). signum okresla sygnal i moze byc dowolnym prawidlowym sygnalem poza SIGKILL i SIGSTOP. Jesli act nie jest NULL-em, to nowa akcja dla sygnalu signum jest brana z act. Jesli oldact tez jest rozny 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 niektorych architekturach czesc tej struktury moze byc unia: nie nalezy ustawiac jednoczesnie pol sa_handler oraz sa_sigaction. Pole sa_restorer nie jest przeznaczone do bezposredniego stosowania (POSIX nie okresla pola sa_restorer). Wiecej informacji o przeznaczeniu tego pola mozna znalezc w podreczniku sigreturn(2). sa_handler specifies the action to be associated with signum and can be one of the following: o SIG_DFL for the default action. o SIG_IGN to ignore this signal. o 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 okresla maske sygnalow, ktore powinny byc blokowane (tj. dodane do maski sygnalow watku, z ktorego sygnal zostal wywolany) podczas wywolywania funkcji obslugi sygnalow. Dodatkowo, sygnal, ktory wywolal te funkcje obslugi bedzie zablokowany, chyba ze uzyto flagi SA_NODEFER. sa_flags podaje zbior flag, ktore modyfikuja zachowanie procesu obslugi sygnalow. Jest to zbior wartosci polaczonych bitowym OR: SA_NOCLDSTOP Jesli signum jest rowne SIGCHLD, to nie sa 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 obslugi sygnalu SIGCHLD. SA_NOCLDWAIT (od Linuksa 2.6) Jesli signum jest rowny SIGCHLD, to dzieci po swoim zakonczeniu nie zostana przeksztalcone w zombie. Patrz takze waitpid(2). Znacznik ma znaczenie tylko ustanawiania funkcji obslugujacej sygnal SIGCHLD lub podczas ustawiania tego sygnalu na SIG_DLF. Jesli znacznik SA_NOCLDWAIT jest ustawiony podczas ustanawiania funkcji obslugujacej sygnal SIGCHLD, to POSIX.1 nie okresla, czy sygnal SIGCHLD po zakonczeniu procesu potomnego. Pod Linuksem sygnal SIGCHLD jest w takim przypadku generowany; niektore inne systemy go nie generuja. 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 Wywoluje funkcje obslugi sygnalu, uzywajac alternatywnego stosu ustawionego przez sigaltstack(2). Jezeli ten alternatywny stos nie jest dostepny, zostanie uzyty stos domyslny. Flaga ta ma znaczenie tylko w przypadku ustanawiania funkcji obslugi sygnalu. SA_RESETHAND Odtwarza akcje sygnalowa do stanu domyslnego po wejsciu funkcji obslugi sygnalu. Flaga ta ma znaczenie tylko w przypadku ustanawiania funkcji obslugi sygnalu. SA_ONESHOT is an obsolete, nonstandard synonym for this flag. SA_RESTART Dostarcza zachowania kompatybilnego z semantyka sygnalowa BSD, czyniac pewne wywolania systemowe odtwarzalnymi przez sygnaly. Flaga ta ma znaczenie podczas ustanawiania procedury obslugi sygnalu. Informacje na temat odtwarzania wywolan systemowych mozna znalezc w podreczniku signal(7). SA_RESTORER Nie jest przeznaczone do bezposredniego stosowania. Flaga ta jest uzywana przez biblioteki C do wskazania, ze pole sa_restorer zawiera adres "trampoliny sygnalu" Wiecej szczegolow w podreczniku sigreturn(2). SA_SIGINFO (od Linuksa 2.2) Funkcja obslugi sygnalow pobiera trzy argumenty, a nie jeden. W typ przypadku zamiast ustawiac sa_handler nalezy ustawic sa_sigaction. Flaga ta ma znaczenie tylko w przypadku ustanawiania funkcji obslugi sygnalu. 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 sygnalu */ int si_errno; /* Wartosc zmiennej errno */ int si_code; /* Kod sygnalu */ int si_trapno; /* Numer pulapki, ktore spowodowala sprzetowe wygenerowanie sygnalu (nieuzywane na wiekszosci architektur) */ pid_t si_pid; /* ID procesu wysylajacego */ uid_t si_uid; /* Rzeczywiste ID uzytk. procesu wysylajacego */ int si_status; /* Kod lub sygnal zakonczenia */ clock_t si_utime; /* Czas zuzyty w przestrzeni uzytkownika */ clock_t si_stime; /* Czas zuzyty przez system operacyjny */ union sigval si_value; /* Wartosc sygnalu */ int si_int; /* Sygnal POSIX.1b */ void *si_ptr; /* Sygnal POSIX.1b */ int si_overrun; /* Licznik przekr. timerow; timery POSIX.1b */ int si_timerid; /* ID timera; timery POSIX.1b */ void *si_addr; /* Adres pamieci powodujacy blad */ long si_band; /* Grupa zdarzenia (byl int w glibc 2.3.2 i wczesniejszych) */ int si_fd; /* Deskryptor pliku */ short si_addr_lsb; /* Mniej istotny bit adresu (od Linuksa 2.6.32) */ void *si_lower; /* Kres dolny przy wystapieniu naruszenia adresu (od Linuksa 3.19) */ void *si_upper; /* Kres gorny przy wystapieniu naruszenia adresu (od Linuksa 3.19) */ int si_pkey; /* Klucz zabezpieczajacy na PTE bedacy powodem bledu (od Linuksa 4.6) */ void *si_call_addr;/* Adres instrukcji wywolania systemowego (od Linuksa 3.5) */ int si_syscall; /* Liczba probowanych wywolan systemowych (od Linuksa 3.5) */ unsigned int si_arch; /* Architektura probowanego wywol. systemowego (od Linuksa 3.5) */ } si_signo, si_errno i si_code sa zdefiniowane dla wszystkich sygnalow. (Generalnie si_errno nie jest uzywane pod Linuksem). Pozostale pola struktury moga byc unia; powinno sie odczytywac tylko pola istotne dla danego sygnalu. o Sygnaly wyslane przez kill(2) i sigqueue(3) maja wypelnione pola si_pid oraz si_uid. Dodatkowo sygnaly wyslane przez sigqueue(3) maja w polach si_int i si_ptr ustawione wartosci podane przez nadawce sygnalu; szczegoly opisano w sigqueue(3). o Sygnaly wyslane przez timery POSIX.1b (od Linuksa 2.6) maja uzupelnione pola si_overrun i si_timerid. Pole si_timerid zawiera wewnetrzny identyfikator uzywany przez jadro do identyfikacji timera; nie jest to ten sam identyfikator, ktory zwraca timer_create(2). Pole si_overrun zawiera informacje o tym, ile razy timer sie przepelnil -- jest to ta sama informacja, ktora zwraca timer_getoverrun(2). Pola te sa niestandardowymi rozszerzeniami Linuksa. o Sygnaly wyslane w celu notyfikacji kolejki komunikatow (patrz opis SIGEV_SIGNAL in mq_notify(3)) maja pola si_int/si_ptr wypelnione wartosciami sigev_value przekazanymi do mq_notify(3); ponadto si_pid zawiera identyfikator procesu wysylajacego sygnal, a si_uid rzeczywisty identyfikator uzytkownika - nadawcy sygnalu. o 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)). o SIGILL, SIGFPE, SIGSEGV, SIGBUS oraz SIGTRAP wypelniaja pole si_addr, ustawiajac w nim adres bledu. Na niektorych architekturach sygnaly wypelniaja takze pole si_trapno. Niektore bledy pochodne SIGBUS, w szczegolnosci BUS_MCEERR_AO i BUS_MCEERR_AR ustawiaja takze si_addr_lsb. Pole to oznacza najmniej znaczacy bit adresu, zatem i rozmiary uszkodzen. Na przyklad jesli cala strona zostala uszkodzona, si_addr_lsb zawierac bedzie log2(sysconf(_SC_PAGESIZE)). Gdy jako odpowiedz na zdarzenie ptrace(2) (PTRACE_EVENT_foo) zostanie dostarczony SIGTRAP, pole si_addr nie jest wypelnione, natomiast pola si_pid i si_uid sa wypelnione identyfikatorami odpowiednio procesu i uzytkownika odpowiedzialnego za dostarczenie pulapki. W przypadku seccomp(2) jako dostarczenie zdarzenia pokazany zostanie zrzut. BUS_MCERR_* i si_addr_lsb sa rozszerzeniami specyficznymi dla Linuksa. SEGV_BNDERR bedacy podbledem SIGSEGV wypelnia pola si_lower i si_upper. SEGV_PKUERR bedacy podbledem SIGSEGV wypelnia pole si_pkey. o SIGIO/SIGPOLL (te dwie nazwy sa synonimami pod Linuksem) wypelnia pola si_band i si_fd. Zdarzenie si_band jest maska bitowa zawierajaca te same wartosci, ktore poll(2) umieszcza w polu revents. Pole si_fd oznacza deskryptor pliku, na ktorym wystapilo dane zdarzenie wejscia/wyjscia; wiecej szczegolow w opisie F_SETSIG w podreczniku fcntl(2). o SIGSYS, generowany (od Linuksa 3.5) gdy filtr seccomp zwroci SECCOMP_RET_TRAP, wypelnia 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 by defining feature test macros (before including any header file) as follows: o _XOPEN_SOURCE with the value 500 or greater; o _XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED; or o _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 zwyklego sygnalu, ponizej zestawiono wartosci, ktore moga wystepowac w si_code dowolnego sygnalu razem z powodami, dla ktorych sygnal byl wygenerowany. SI_USER kill(2). SI_KERNEL Wysylany przez jadro. SI_QUEUE sigqueue(3). SI_TIMER Wygasniecie timera POSIX. SI_MESGQ (od Linuksa 2.6.6) Zmiana stanu kolejki komunikatow POSIX; patrz mq_notify(3) SI_ASYNCIO Ukonczenie asynchronicznej operacji wejscia/wyjscia. 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) Nastepujace wartosci moga zostac umieszczone w si_code sygnalu SIGILL: ILL_ILLOPC Niedozwolony kod operacji. ILL_ILLOPN Niedozwolony operand. ILL_ILLADR Niedozwolony tryb adresowania. ILL_ILLTRP Niedozwolona pulapka. ILL_PRVOPC Uprzywilejowany kod operacji. ILL_PRVREG Uprzywilejowany rejestr. ILL_COPROC Blad koprocesora. ILL_BADSTK Wewnetrzny blad stosu. Nastepujace wartosci moga zostac umieszczone w si_code sygnalu SIGFPE: FPE_INTDIV Dzielenie wartosci calkowitej przez zero. FPE_INTOVF Przepelnienie liczby calkowitej. FPE_FLTDIV Dzielenie wartosci zmiennoprzecinkowej przez zero. FPE_FLTOVF Przekroczenie zakresu operacji zmiennoprzecinkowej. FPE_FLTUND Przekroczenie (w dol) zakresu operacji zmiennoprzecinkowej. FPE_FLTRES Niedokladny wynik operacji zmiennoprzecinkowej. FPE_FLTINV Niepoprawna operacja zmiennoprzecinkowa. FPE_FLTSUB Dolny indeks poza zakresem. Nastepujace wartosci moga zostac umieszczone w si_code sygnalu 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. Nastepujace wartosci moga zostac umieszczone w si_code sygnalu SIGBUS: BUS_ADRALN Niepoprawne wyrownanie adresu. BUS_ADRERR Nieistniejacy adres fizyczny. BUS_OBJERR Blad sprzetowy specyficzny dla obiektu. BUS_MCEERR_AR (od Linuksa 2.6.32) Sprzetowy blad pamieci podczas sprawdzania komputera; wymagane podjecie akcji. BUS_MCEERR_AO (od Linuksa 2.6.32) Wykryto sprzetowy blad pamieci w procesie; opcjonalne podjecie akcji. Nastepujace wartosci moga zostac umieszczone w si_code sygnalu SIGTRAP: TRAP_BRKPT Punkt wstrzymania procesu. TRAP_TRACE Sledzony proces zlapany. TRAP_BRANCH (od Linuksa 2.4, tylko IA64) Sledzone rozgalezienie procesu zlapane. TRAP_HWBKPT (od Linuksa 2.4, tylko IA64) Pulapka sprzetowa. Nastepujace wartosci moga zostac umieszczone w si_code sygnalu SIGCHLD: CLD_EXITED Proces potomny sie zakonczyl. CLD_KILLED Proces potomny zostal zabity. CLD_DUMPED Potomek zakonczyl sie w nieprawidlowy sposob. CLD_TRAPPED Sledzony potomek zostal zlapany. CLD_STOPPED Proces potomny zostal zatrzymany. CLD_CONTINUED (od Linuksa 2.6.9) Zatrzymany proces potomny zostal wznowiony. Nastepujace wartosci moga zostac umieszczone w si_code sygnalu SIGIO/SIGPOLL: POLL_IN Dostepne dane na wejsciu. POLL_OUT Dostepne bufory wyjscia. POLL_MSG Dostepna wiadomosc na wejsciu. POLL_ERR Blad wejscia/wyjscia. POLL_PRI Dostepne wejscie o wysokim priorytecie. POLL_HUP Urzadzenie odlaczone. Nastepujaca wartosc moze zostac umieszczona w si_code sygnalu SIGSYS: SYS_SECCOMP (od Linuksa 3.5) Wyzwolone przez regule 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. WARTOSC ZWRACANA sigaction() w przypadku powodzenia zwraca 0. W razie wystapienia bledu zwracane jest -1 i ustawiana jest zmienna errno wskazujac na blad. BLEDY EFAULT act lub oldact wskazuja na pamiec poza przestrzenia adresowa procesu. EINVAL Podano nieprawidlowy sygnal. Bedzie to tez generowane w przypadku proby zmienienia akcji dla sygnalow SIGKILL lub SIGSTOP, ktore nie moga byc przechwycone lub zignorowane. WERSJE Roznice biblioteki C/jadra Funkcja opakowujaca glibc dla sigaction() daje blad (EINVAL) przy probie zmiany dyspozycji dwoch sygnalow czasu rzeczywistego uzywanych wewnetrznie przez implementacje watkowa NPTL. Wiecej szczegolow w podreczniku 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 wywolanie systemowe nazywalo sie sigaction(). Jednak po pojawieniu sie sygnalow czasu rzeczywistego w Linuksie 2.2, 32-bitowy typ sigset_t o stalym rozmiarze obslugiwany przez to wywolanie przestal dobrze sluzyc swemu zadaniu. Z tego powodu, w celu obslugi powiekszonego typu sigset_t dodano nowe wywolanie systemowe rt_sigaction(). Nowe wywolanie przyjmuje czwarty argument size_t sigsetsize, ktory okresla rozmiar w bajtach zestawu sygnalow w act.sa_mask i oldact.sa_mask. Argument ten obecnie musi miec wartosc sizeof(sigset_t) (albo nastapi blad EINVAL). Opakowanie glibc sigaction() ukrywa te detale przed nami, po cichu wywolujac rt_sigaction() jesli udostepnia je jadro. STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4. POSIX.1-1990 zabranial ustawiania akcji dla SIGCHLD na SIG_IGN. POSIX.1-2001 i pozniejsze pozwalaja na to, tak ze mozna uzyc ignorowania SIGCHLD, zeby zapobiec tworzeniu procesow-duchow (patrz wait(2)). Niemniej jednak, historyczne zachowanie systemow BSD i System V w zakresie ignorowania SIGCHLD jest inne, tak wiec jedyna calkowicie przenosna metoda zapewnienia, ze potomek po zakonczeniu nie zostanie procesem-duchem jest przechwytywanie sygnalu SIGCHLD i wywolanie funkcji wait(2) lub podobnej. POSIX.1-1990 okreslal tylko SA_NOCLDSTOP. W POSIX.1-2001 dodano SA_NOCLDSTOP, SA_NOCLDWAIT, SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART oraz SA_SIGINFO. Uzywanie tych nowych wartosci sa_flags moze byc mniej przenosne w aplikacjach przewidzianych do uzycia w starszych implementacjach Uniksa. Flaga SA_RESETHAND jest kompatybilna z flaga 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). UWAGI Dziecko utworzone przez fork(2) dziedziczy kopie ustawien sygnalow od swojego rodzica. Podczas wywolania execve(2) przywracane sa wartosci domyslne ustawien, z wyjatkiem ustawienia ignorowania sygnalu, ktore nie jest zmieniane. Zgodnie z POSIX, zachowanie procesu po zignorowaniu sygnalu SIGFPE, SIGILL lub SIGSEGV, niewygenerowanego przez kill(2) lub raise(3), jest niezdefiniowane. Dzielenie liczby calkowitej przez zero ma wynik niezdefiniowany. Na niektorych architekturach generuje sygnal SIGFPE (Takze dzielenie najmniejszej ujemnej liczby calkowitej przez -1 moze wygenerowac SIGFPE). Ignorowanie go moze prowadzic do nieskonczonej petli. sigaction() moze byc wywolywany z drugim argumentem o wartosci NULL, powodujac w ten sposob zapytanie o biezacy handler sygnalu. Moze go tez uzyc do sprawdzenia, czy dany sygnal jest prawidlowy na obecnej maszynie. W tym celu nalezy zarowno drugi, jak i trzeci argument ustawic na NULL. Nie mozna zablokowac sygnalow SIGKILL lub SIGSTOP (przez podanie ich w sa_mask). Proby takie zostana zignorowane. Zobacz sigsetops(3) dla szczegolow o operacjach na zbiorach sygnalow. Liste funkcji, ktore mozna bezpiecznie wywolac w procedurze obslugi sygnalu, mozna znalezc w podreczniku signal-safety(7). 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. USTERKI 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. PRZYKLADY 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 #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); } ZOBACZ TAKZE 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) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. sigaction(2)