diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-24 04:52:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-24 04:52:22 +0000 |
commit | 3d08cd331c1adcf0d917392f7e527b3f00511748 (patch) | |
tree | 312f0d1e1632f48862f044b8bb87e602dcffb5f9 /man2/sigaction.2 | |
parent | Adding debian version 6.7-2. (diff) | |
download | manpages-3d08cd331c1adcf0d917392f7e527b3f00511748.tar.xz manpages-3d08cd331c1adcf0d917392f7e527b3f00511748.zip |
Merging upstream version 6.8.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'man2/sigaction.2')
-rw-r--r-- | man2/sigaction.2 | 1210 |
1 files changed, 0 insertions, 1210 deletions
diff --git a/man2/sigaction.2 b/man2/sigaction.2 deleted file mode 100644 index bbe4d5a..0000000 --- a/man2/sigaction.2 +++ /dev/null @@ -1,1210 +0,0 @@ -.\" 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. -.\" -.TH sigaction 2 2024-02-25 "Linux man-pages 6.7" -.SH NAME -sigaction, rt_sigaction \- examine and change a signal action -.SH LIBRARY -Standard C library -.RI ( libc ", " \-lc ) -.SH SYNOPSIS -.nf -.B #include <signal.h> -.P -.BI "int sigaction(int " signum , -.BI " const struct sigaction *_Nullable restrict " act , -.BI " struct sigaction *_Nullable restrict " oldact ); -.fi -.P -.RS -4 -Feature Test Macro Requirements for glibc (see -.BR feature_test_macros (7)): -.RE -.P -.BR sigaction (): -.nf - _POSIX_C_SOURCE -.fi -.P -.IR siginfo_t : -.nf - _POSIX_C_SOURCE >= 199309L -.fi -.SH DESCRIPTION -The -.BR sigaction () -system call is used to change the action taken by a process on -receipt of a specific signal. -(See -.BR signal (7) -for an overview of signals.) -.P -.I signum -specifies the signal and can be any valid signal except -.B SIGKILL -and -.BR SIGSTOP . -.P -If -.I act -is non-NULL, the new action for signal -.I signum -is installed from -.IR act . -If -.I oldact -is non-NULL, the previous action is saved in -.IR oldact . -.P -The -.I sigaction -structure is defined as something like: -.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 -On some architectures a union is involved: do not assign to both -.I sa_handler -and -.IR sa_sigaction . -.P -The -.I sa_restorer -field is not intended for application use. -(POSIX does not specify a -.I sa_restorer -field.) -Some further details of the purpose of this field can be found in -.BR sigreturn (2). -.P -.I sa_handler -specifies the action to be associated with -.I signum -and can be one of the following: -.IP \[bu] 3 -.B SIG_DFL -for the default action. -.IP \[bu] -.B SIG_IGN -to ignore this signal. -.IP \[bu] -A pointer to a signal handling function. -This function receives the signal number as its only argument. -.P -If -.B SA_SIGINFO -is specified in -.IR sa_flags , -then -.I sa_sigaction -(instead of -.IR sa_handler ) -specifies the signal-handling function for -.IR signum . -This function receives three arguments, as described below. -.P -.I sa_mask -specifies a mask of signals which should be blocked -(i.e., added to the signal mask of the thread in which -the signal handler is invoked) -during execution of the signal handler. -In addition, the signal which triggered the handler -will be blocked, unless the -.B SA_NODEFER -flag is used. -.P -.I sa_flags -specifies a set of flags which modify the behavior of the signal. -It is formed by the bitwise OR of zero or more of the following: -.TP -.B SA_NOCLDSTOP -If -.I signum -is -.BR SIGCHLD , -do not receive notification when child processes stop (i.e., when they -receive one of -.BR SIGSTOP ", " SIGTSTP ", " SIGTTIN , -or -.BR SIGTTOU ) -or resume (i.e., they receive -.BR SIGCONT ) -(see -.BR wait (2)). -This flag is meaningful only when establishing a handler for -.BR SIGCHLD . -.TP -.BR SA_NOCLDWAIT " (since Linux 2.6)" -.\" To be precise: Linux 2.5.60 -- MTK -If -.I signum -is -.BR SIGCHLD , -do not transform children into zombies when they terminate. -See also -.BR waitpid (2). -This flag is meaningful only when establishing a handler for -.BR SIGCHLD , -or when setting that signal's disposition to -.BR SIG_DFL . -.IP -If the -.B SA_NOCLDWAIT -flag is set when establishing a handler for -.BR SIGCHLD , -POSIX.1 leaves it unspecified whether a -.B SIGCHLD -signal is generated when a child process terminates. -On Linux, a -.B SIGCHLD -signal is generated in this case; -on some other implementations, it is not. -.TP -.B SA_NODEFER -Do not add the signal to the thread's signal mask while the -handler is executing, unless the signal is specified in -.IR 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. -.IP -.B SA_NOMASK -is an obsolete, nonstandard synonym for this flag. -.TP -.B SA_ONSTACK -Call the signal handler on an alternate signal stack provided by -.BR sigaltstack (2). -If an alternate stack is not available, the default stack will be used. -This flag is meaningful only when establishing a signal handler. -.TP -.B SA_RESETHAND -Restore the signal action to the default upon entry to the signal handler. -This flag is meaningful only when establishing a signal handler. -.IP -.B SA_ONESHOT -is an obsolete, nonstandard synonym for this flag. -.TP -.B SA_RESTART -Provide behavior compatible with BSD signal semantics by making certain -system calls restartable across signals. -This flag is meaningful only when establishing a signal handler. -See -.BR signal (7) -for a discussion of system call restarting. -.TP -.B SA_RESTORER -.IR "Not intended for application use" . -This flag is used by C libraries to indicate that the -.I sa_restorer -field contains the address of a "signal trampoline". -See -.BR sigreturn (2) -for more details. -.TP -.BR SA_SIGINFO " (since Linux 2.2)" -The signal handler takes three arguments, not one. -In this case, -.I sa_sigaction -should be set instead of -.IR sa_handler . -This flag is meaningful only when establishing a signal handler. -.\" (The -.\" .I sa_sigaction -.\" field was added in Linux 2.1.86.) -.\" -.TP -.BR SA_UNSUPPORTED " (since Linux 5.11)" -Used to dynamically probe for flag bit support. -.IP -If an attempt to register a handler succeeds with this flag set in -.I act\->sa_flags -alongside other flags that are potentially unsupported by the kernel, -and an immediately subsequent -.BR sigaction () -call specifying the same signal number and with a non-NULL -.I oldact -argument yields -.B SA_UNSUPPORTED -.I clear -in -.IR oldact\->sa_flags , -then -.I 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. -.TP -.BR SA_EXPOSE_TAGBITS " (since Linux 5.11)" -Normally, when delivering a signal, -an architecture-specific set of tag bits are cleared from the -.I si_addr -field of -.IR siginfo_t . -If this flag is set, -an architecture-specific subset of the tag bits will be preserved in -.IR si_addr . -.IP -Programs that need to be compatible with Linux versions older than 5.11 -must use -.B SA_UNSUPPORTED -to probe for support. -.SS The siginfo_t argument to a SA_SIGINFO handler -When the -.B SA_SIGINFO -flag is specified in -.IR act.sa_flags , -the signal handler address is passed via the -.I act.sa_sigaction -field. -This handler takes three arguments, as follows: -.P -.in +4n -.EX -void -handler(int sig, siginfo_t *info, void *ucontext) -{ - ... -} -.EE -.in -.P -These three arguments are as follows -.TP -.I sig -The number of the signal that caused invocation of the handler. -.TP -.I info -A pointer to a -.IR siginfo_t , -which is a structure containing further information about the signal, -as described below. -.TP -.I ucontext -This is a pointer to a -.I ucontext_t -structure, cast to \fIvoid\ *\fP. -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 -.BR sigreturn (2). -Further information about the -.I ucontext_t -structure can be found in -.BR getcontext (3) -and -.BR signal (7). -Commonly, the handler function doesn't make any use of the third argument. -.P -The -.I siginfo_t -data type is a structure with the following fields: -.P -.in +4n -.EX -siginfo_t { - int si_signo; /* Signal number */ - int si_errno; /* An errno value */ - int si_code; /* Signal code */ - int si_trapno; /* Trap number that caused - hardware\-generated signal - (unused on most architectures) */ -.\" 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. - pid_t si_pid; /* Sending process ID */ - uid_t si_uid; /* Real user ID of sending process */ - int si_status; /* Exit value or signal */ - clock_t si_utime; /* User time consumed */ - clock_t si_stime; /* System time consumed */ - union sigval si_value; /* Signal value */ - int si_int; /* POSIX.1b signal */ - void *si_ptr; /* POSIX.1b signal */ - int si_overrun; /* Timer overrun count; - POSIX.1b timers */ - int si_timerid; /* Timer ID; POSIX.1b timers */ -.\" In the kernel: si_tid - void *si_addr; /* Memory location which caused fault */ - long si_band; /* Band event (was \fIint\fP in - glibc 2.3.2 and earlier) */ - int si_fd; /* File descriptor */ - short si_addr_lsb; /* Least significant bit of address - (since Linux 2.6.32) */ - void *si_lower; /* Lower bound when address violation - occurred (since Linux 3.19) */ - void *si_upper; /* Upper bound when address violation - occurred (since Linux 3.19) */ - int si_pkey; /* Protection key on PTE that caused - fault (since Linux 4.6) */ - void *si_call_addr; /* Address of system call instruction - (since Linux 3.5) */ - int si_syscall; /* Number of attempted system call - (since Linux 3.5) */ - unsigned int si_arch; /* Architecture of attempted system call - (since Linux 3.5) */ -} -.EE -.in -.P -.IR si_signo ", " si_errno " and " si_code -are defined for all signals. -.RI ( si_errno -is generally unused on Linux.) -The rest of the struct may be a union, so that one should -read only the fields that are meaningful for the given signal: -.IP \[bu] 3 -Signals sent with -.BR kill (2) -and -.BR sigqueue (3) -fill in -.IR si_pid " and " si_uid . -In addition, signals sent with -.BR sigqueue (3) -fill in -.IR si_int " and " si_ptr -with the values specified by the sender of the signal; -see -.BR sigqueue (3) -for more details. -.IP \[bu] -Signals sent by POSIX.1b timers (since Linux 2.6) fill in -.I si_overrun -and -.IR si_timerid . -The -.I si_timerid -field is an internal ID used by the kernel to identify -the timer; it is not the same as the timer ID returned by -.BR timer_create (2). -The -.I si_overrun -field is the timer overrun count; -this is the same information as is obtained by a call to -.BR timer_getoverrun (2). -These fields are nonstandard Linux extensions. -.IP \[bu] -Signals sent for message queue notification (see the description of -.B SIGEV_SIGNAL -in -.BR mq_notify (3)) -fill in -.IR si_int / si_ptr , -with the -.I sigev_value -supplied to -.BR mq_notify (3); -.IR si_pid , -with the process ID of the message sender; and -.IR si_uid , -with the real user ID of the message sender. -.IP \[bu] -.B SIGCHLD -fills in -.IR si_pid ", " si_uid ", " si_status ", " si_utime ", and " si_stime , -providing information about the child. -The -.I si_pid -field is the process ID of the child; -.I si_uid -is the child's real user ID. -The -.I si_status -field contains the exit status of the child (if -.I si_code -is -.BR CLD_EXITED ), -or the signal number that caused the process to change state. -The -.I si_utime -and -.I 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 -.BR getrusage (2) -and -.BR times (2)). -Up to Linux 2.6, and since Linux 2.6.27, these fields report -CPU time in units of -.IR 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 -.BR time (7)). -.\" 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. -.IP \[bu] -.BR SIGILL , -.BR SIGFPE , -.BR SIGSEGV , -.BR SIGBUS , -and -.B SIGTRAP -fill in -.I si_addr -with the address of the fault. -On some architectures, -these signals also fill in the -.I si_trapno -field. -.IP -Some suberrors of -.BR SIGBUS , -in particular -.B BUS_MCEERR_AO -and -.BR BUS_MCEERR_AR , -also fill in -.IR si_addr_lsb . -This field indicates the least significant bit of the reported address -and therefore the extent of the corruption. -For example, if a full page was corrupted, -.I si_addr_lsb -contains -.IR log2(sysconf(_SC_PAGESIZE)) . -When -.B SIGTRAP -is delivered in response to a -.BR ptrace (2) -event (PTRACE_EVENT_foo), -.I si_addr -is not populated, but -.I si_pid -and -.I si_uid -are populated with the respective process ID and user ID responsible for -delivering the trap. -In the case of -.BR seccomp (2), -the tracee will be shown as delivering the event. -.B BUS_MCEERR_* -and -.I si_addr_lsb -are Linux-specific extensions. -.IP -The -.B SEGV_BNDERR -suberror of -.B SIGSEGV -populates -.I si_lower -and -.IR si_upper . -.IP -The -.B SEGV_PKUERR -suberror of -.B SIGSEGV -populates -.IR si_pkey . -.IP \[bu] -.BR SIGIO / SIGPOLL -(the two names are synonyms on Linux) -fills in -.I si_band -and -.IR si_fd . -The -.I si_band -event is a bit mask containing the same values as are filled in the -.I revents -field by -.BR poll (2). -The -.I si_fd -field indicates the file descriptor for which the I/O event occurred; -for further details, see the description of -.B F_SETSIG -in -.BR fcntl (2). -.IP \[bu] -.BR SIGSYS , -generated (since Linux 3.5) -.\" commit a0727e8ce513fe6890416da960181ceb10fbfae6 -when a seccomp filter returns -.BR SECCOMP_RET_TRAP , -fills in -.IR si_call_addr , -.IR si_syscall , -.IR si_arch , -.IR si_errno , -and other fields as described in -.BR seccomp (2). -.\" -.SS -The si_code field -The -.I si_code -field inside the -.I siginfo_t -argument that is passed to a -.B SA_SIGINFO -signal handler is a value (not a bit mask) -indicating why this signal was sent. -For a -.BR ptrace (2) -event, -.I si_code -will contain -.B SIGTRAP -and have the ptrace event in the high byte: -.P -.in +4n -.EX -(SIGTRAP | PTRACE_EVENT_foo << 8). -.EE -.in -.P -For a -.RB non- ptrace (2) -event, the values that can appear in -.I si_code -are described in the remainder of this section. -Since glibc 2.20, -the definitions of most of these symbols are obtained from -.I <signal.h> -by defining feature test macros (before including -.I any -header file) as follows: -.IP \[bu] 3 -.B _XOPEN_SOURCE -with the value 500 or greater; -.IP \[bu] -.B _XOPEN_SOURCE -and -.BR _XOPEN_SOURCE_EXTENDED ; -or -.IP \[bu] -.B _POSIX_C_SOURCE -with the value 200809L or greater. -.P -For the -.B 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. -.P -For a regular signal, the following list shows the values which can be -placed in -.I si_code -for any signal, along with the reason that the signal was generated. -.RS 4 -.TP -.B SI_USER -.BR kill (2). -.TP -.B SI_KERNEL -Sent by the kernel. -.TP -.B SI_QUEUE -.BR sigqueue (3). -.TP -.B SI_TIMER -POSIX timer expired. -.TP -.BR SI_MESGQ " (since Linux 2.6.6)" -POSIX message queue state changed; see -.BR mq_notify (3). -.TP -.B SI_ASYNCIO -AIO completed. -.TP -.B SI_SIGIO -Queued -.B SIGIO -(only up to Linux 2.2; from Linux 2.4 onward -.BR SIGIO / SIGPOLL -fills in -.I si_code -as described below). -.TP -.BR SI_TKILL " (since Linux 2.4.19)" -.BR tkill (2) -or -.BR tgkill (2). -.\" 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. -.RE -.P -The following values can be placed in -.I si_code -for a -.B SIGILL -signal: -.RS 4 -.TP -.B ILL_ILLOPC -Illegal opcode. -.TP -.B ILL_ILLOPN -Illegal operand. -.TP -.B ILL_ILLADR -Illegal addressing mode. -.TP -.B ILL_ILLTRP -Illegal trap. -.TP -.B ILL_PRVOPC -Privileged opcode. -.TP -.B ILL_PRVREG -Privileged register. -.TP -.B ILL_COPROC -Coprocessor error. -.TP -.B ILL_BADSTK -Internal stack error. -.RE -.P -The following values can be placed in -.I si_code -for a -.B SIGFPE -signal: -.RS 4 -.TP -.B FPE_INTDIV -Integer divide by zero. -.TP -.B FPE_INTOVF -Integer overflow. -.TP -.B FPE_FLTDIV -Floating-point divide by zero. -.TP -.B FPE_FLTOVF -Floating-point overflow. -.TP -.B FPE_FLTUND -Floating-point underflow. -.TP -.B FPE_FLTRES -Floating-point inexact result. -.TP -.B FPE_FLTINV -Floating-point invalid operation. -.TP -.B FPE_FLTSUB -Subscript out of range. -.RE -.P -The following values can be placed in -.I si_code -for a -.B SIGSEGV -signal: -.RS 4 -.TP -.B SEGV_MAPERR -Address not mapped to object. -.TP -.B SEGV_ACCERR -Invalid permissions for mapped object. -.TP -.BR SEGV_BNDERR " (since Linux 3.19)" -.\" commit ee1b58d36aa1b5a79eaba11f5c3633c88231da83 -Failed address bound checks. -.TP -.BR SEGV_PKUERR " (since Linux 4.6)" -.\" commit cd0ea35ff5511cde299a61c21a95889b4a71464e -Access was denied by memory protection keys. -See -.BR pkeys (7). -The protection key which applied to this access is available via -.IR si_pkey . -.RE -.P -The following values can be placed in -.I si_code -for a -.B SIGBUS -signal: -.RS 4 -.TP -.B BUS_ADRALN -Invalid address alignment. -.TP -.B BUS_ADRERR -Nonexistent physical address. -.TP -.B BUS_OBJERR -Object-specific hardware error. -.TP -.BR BUS_MCEERR_AR " (since Linux 2.6.32)" -Hardware memory error consumed on a machine check; action required. -.TP -.BR BUS_MCEERR_AO " (since Linux 2.6.32)" -Hardware memory error detected in process but not consumed; action optional. -.RE -.P -The following values can be placed in -.I si_code -for a -.B SIGTRAP -signal: -.RS 4 -.TP -.B TRAP_BRKPT -Process breakpoint. -.TP -.B TRAP_TRACE -Process trace trap. -.TP -.BR TRAP_BRANCH " (since Linux 2.4, IA64 only)" -Process taken branch trap. -.TP -.BR TRAP_HWBKPT " (since Linux 2.4, IA64 only)" -Hardware breakpoint/watchpoint. -.RE -.P -The following values can be placed in -.I si_code -for a -.B SIGCHLD -signal: -.RS 4 -.TP -.B CLD_EXITED -Child has exited. -.TP -.B CLD_KILLED -Child was killed. -.TP -.B CLD_DUMPED -Child terminated abnormally. -.TP -.B CLD_TRAPPED -Traced child has trapped. -.TP -.B CLD_STOPPED -Child has stopped. -.TP -.BR CLD_CONTINUED " (since Linux 2.6.9)" -Stopped child has continued. -.RE -.P -The following values can be placed in -.I si_code -for a -.BR SIGIO / SIGPOLL -signal: -.RS 4 -.TP -.B POLL_IN -Data input available. -.TP -.B POLL_OUT -Output buffers available. -.TP -.B POLL_MSG -Input message available. -.TP -.B POLL_ERR -I/O error. -.TP -.B POLL_PRI -High priority input available. -.TP -.B POLL_HUP -Device disconnected. -.RE -.P -The following value can be placed in -.I si_code -for a -.B SIGSYS -signal: -.RS 4 -.TP -.BR SYS_SECCOMP " (since Linux 3.5)" -Triggered by a -.BR seccomp (2) -filter rule. -.RE -.SS Dynamically probing for flag bit support -The -.BR sigaction () -call on Linux accepts unknown bits set in -.I act\->sa_flags -without error. -The behavior of the kernel starting with Linux 5.11 is that a second -.BR sigaction () -will clear unknown bits from -.IR oldact\->sa_flags . -However, historically, a second -.BR sigaction () -call would typically leave those bits set in -.IR oldact\->sa_flags . -.P -This means that support for new flags cannot be detected -simply by testing for a flag in -.IR sa_flags , -and a program must test that -.B SA_UNSUPPORTED -has been cleared before relying on the contents of -.IR sa_flags . -.P -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 -.BR sigaction () -in the signal handler itself. -.P -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 -.IR act\->sa_flags . -.P -The flags -.BR SA_NOCLDSTOP , -.BR SA_NOCLDWAIT , -.BR SA_SIGINFO , -.BR SA_ONSTACK , -.BR SA_RESTART , -.BR SA_NODEFER , -.BR SA_RESETHAND , -and, if defined by the architecture, -.B 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. -.P -See EXAMPLES below for a demonstration of the use of -.BR SA_UNSUPPORTED . -.SH RETURN VALUE -.BR sigaction () -returns 0 on success; on error, \-1 is returned, and -.I errno -is set to indicate the error. -.SH ERRORS -.TP -.B EFAULT -.IR act " or " oldact -points to memory which is not a valid part of the process address space. -.TP -.B EINVAL -An invalid signal was specified. -This will also be generated if an attempt -is made to change the action for -.BR SIGKILL " or " SIGSTOP , -which cannot be caught or ignored. -.SH VERSIONS -.SS C library/kernel differences -The glibc wrapper function for -.BR sigaction () -gives an error -.RB ( EINVAL ) -on attempts to change the disposition of the two real-time signals -used internally by the NPTL threading implementation. -See -.BR nptl (7) -for details. -.P -On architectures where the signal trampoline resides in the C library, -the glibc wrapper function for -.BR sigaction () -places the address of the trampoline code in the -.I act.sa_restorer -field and sets the -.B SA_RESTORER -flag in the -.I act.sa_flags -field. -See -.BR sigreturn (2). -.P -The original Linux system call was named -.BR sigaction (). -However, with the addition of real-time signals in Linux 2.2, -the fixed-size, 32-bit -.I sigset_t -type supported by that system call was no longer fit for purpose. -Consequently, a new system call, -.BR rt_sigaction (), -was added to support an enlarged -.I sigset_t -type. -The new system call takes a fourth argument, -.IR "size_t sigsetsize" , -which specifies the size in bytes of the signal sets in -.I act.sa_mask -and -.IR oldact.sa_mask . -This argument is currently required to have the value -.I sizeof(sigset_t) -(or the error -.B EINVAL -results). -The glibc -.BR sigaction () -wrapper function hides these details from us, transparently calling -.BR rt_sigaction () -when the kernel provides it. -.SH STANDARDS -POSIX.1-2008. -.SH HISTORY -POSIX.1-2001, SVr4. -.\" SVr4 does not document the EINTR condition. -.P -POSIX.1-1990 disallowed setting the action for -.B SIGCHLD -to -.BR SIG_IGN . -POSIX.1-2001 and later allow this possibility, so that ignoring -.B SIGCHLD -can be used to prevent the creation of zombies (see -.BR wait (2)). -Nevertheless, the historical BSD and System\ V behaviors for ignoring -.B SIGCHLD -differ, so that the only completely portable method of ensuring that -terminated children do not become zombies is to catch the -.B SIGCHLD -signal and perform a -.BR wait (2) -or similar. -.P -POSIX.1-1990 specified only -.BR SA_NOCLDSTOP . -POSIX.1-2001 added -.BR SA_NOCLDWAIT , -.BR SA_NODEFER , -.BR SA_ONSTACK , -.BR SA_RESETHAND , -.BR SA_RESTART , -and -.B SA_SIGINFO -as XSI extensions. -POSIX.1-2008 moved -.BR SA_NODEFER , -.BR SA_RESETHAND , -.BR SA_RESTART , -and -.B SA_SIGINFO -to the base specifications. -Use of these latter values in -.I sa_flags -may be less portable in applications intended for older -UNIX implementations. -.P -The -.B SA_RESETHAND -flag is compatible with the SVr4 flag of the same name. -.P -The -.B 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 -.I sa_mask -settings). -.SH NOTES -A child created via -.BR fork (2) -inherits a copy of its parent's signal dispositions. -During an -.BR execve (2), -the dispositions of handled signals are reset to the default; -the dispositions of ignored signals are left unchanged. -.P -According to POSIX, the behavior of a process is undefined after it -ignores a -.BR SIGFPE , -.BR SIGILL , -or -.B SIGSEGV -signal that was not generated by -.BR kill (2) -or -.BR raise (3). -Integer division by zero has undefined result. -On some architectures it will generate a -.B SIGFPE -signal. -(Also dividing the most negative integer by \-1 may generate -.BR SIGFPE .) -Ignoring this signal might lead to an endless loop. -.P -.BR sigaction () -can be called with a NULL second argument to query the current signal -handler. -It can also be used to check whether a given signal is valid for -the current machine by calling it with NULL second and third arguments. -.P -It is not possible to block -.BR SIGKILL " or " SIGSTOP -(by specifying them in -.IR sa_mask ). -Attempts to do so are silently ignored. -.P -See -.BR sigsetops (3) -for details on manipulating signal sets. -.P -See -.BR signal\-safety (7) -for a list of the async-signal-safe functions that can be -safely called inside from inside a signal handler. -.\" -.SS Undocumented -Before the introduction of -.BR SA_SIGINFO , -it was also possible to get some additional information about the signal. -This was done by providing an -.I sa_handler -signal handler with a second argument of type -.IR "struct sigcontext" , -which is the same structure as the one that is passed in the -.I uc_mcontext -field of the -.I ucontext -structure that is passed (via a pointer) in the third argument of the -.I sa_sigaction -handler. -See the relevant Linux kernel sources for details. -This use is obsolete now. -.SH BUGS -When delivering a signal with a -.B SA_SIGINFO -handler, -the kernel does not always provide meaningful values -for all of the fields of the -.I siginfo_t -that are relevant for that signal. -.P -Up to and including Linux 2.6.13, specifying -.B SA_NODEFER -in -.I sa_flags -prevents not only the delivered signal from being masked during -execution of the handler, but also the signals specified in -.IR sa_mask . -This bug was fixed in Linux 2.6.14. -.\" commit 69be8f189653cd81aae5a74e26615b12871bb72e -.SH EXAMPLES -See -.BR mprotect (2). -.SS Probing for flag support -The following example program exits with status -.B EXIT_SUCCESS -if -.B SA_EXPOSE_TAGBITS -is determined to be supported, and -.B EXIT_FAILURE -otherwise. -.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 SEE ALSO -.BR kill (1), -.BR kill (2), -.BR pause (2), -.BR pidfd_send_signal (2), -.BR restart_syscall (2), -.BR seccomp (2), -.BR sigaltstack (2), -.BR signal (2), -.BR signalfd (2), -.BR sigpending (2), -.BR sigprocmask (2), -.BR sigreturn (2), -.BR sigsuspend (2), -.BR wait (2), -.BR killpg (3), -.BR raise (3), -.BR siginterrupt (3), -.BR sigqueue (3), -.BR sigsetops (3), -.BR sigvec (3), -.BR core (5), -.BR signal (7) |