sigaction(2) System Calls Manual sigaction(2) sigaction, rt_sigaction - (libc -lc) #include int sigaction(int signum, const struct sigaction *_Nullable restrict act, struct sigaction *_Nullable restrict oldact); glibc ( feature_test_macros(7)): sigaction(): _POSIX_C_SOURCE siginfo_t: _POSIX_C_SOURCE >= 199309L sigaction() . ( signal(7) .) signum SIGKILL SIGSTOP. act NULL signum act. oldact NULL oldact. sigaction : struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); }; "union" : sa_handler sa_sigaction . sa_restorer . ( POSIX sa_restorer.) sigreturn(2). sa_handler signum : o SIG_DFL . o SIG_IGN . o . . SA_SIGINFO sa_flags sa_sigaction ( sa_handler) signum. . sa_mask ( ) . SA_NODEFER. sa_flags . OR : SA_NOCLDSTOP signum SIGCHLD ( SIGSTOP SIGTSTP SIGTTIN SIGTTOU) ( SIGCONT) ( wait(2)). SIGCHLD. SA_NOCLDWAIT ( 2.6) signum SIGCHLD (zombies) . waitpid(2). SIGCHLD SIG_DFL. SA_NOCLDWAIT SIGCHLD POSIX.1 SIGCHLD . SIGCHLD . SA_NODEFER act.sa_mask. . . SA_NOMASK . SA_ONSTACK sigaltstack(2). . . SA_RESETHAND . . SA_ONESHOT . SA_RESTART BSD . . signal(7) . SA_RESTORER . sa_restorer "signal trampoline". sigreturn(2) . SA_SIGINFO ( 2.2) . sa_sigaction sa_handler. . SA_UNSUPPORTED ( 5.11) . act->sa_flags sigaction() oldact (non-NULL) SA_UNSUPPORTED oldact->sa_flags oldact->sa_flags . " " . SA_EXPOSE_TAGBITS ( 5.11) si_addr siginfo_t. si_addr. 5.11 SA_UNSUPPORTED . siginfo_t SA_SIGINFO SA_SIGINFO act.sa_flags act.sa_sigaction. : void handler(int sig, siginfo_t *info, void *ucontext) { ... } sig . info siginfo_t . ucontext ucontext_t void *. sigreturn(2). ucontext_t getcontext(3) signal(7). . siginfo_t : siginfo_t { int si_signo; /* */ int si_errno; /* errno */ int si_code; /* */ int si_trapno; /* ( ) */ pid_t si_pid; /* */ uid_t si_uid; /* */ int si_status; /* */ clock_t si_utime; /* */ clock_t si_stime; /* */ union sigval si_value; /* */ int si_int; /* POSIX.1b */ void *si_ptr; /* POSIX.1b */ int si_overrun; /* POSIX.1b */ int si_timerid; /* POSIX.1b */ void *si_addr; /* */ long si_band; /* ( int glibc 2.3.2 ) */ int si_fd; /* */ short si_addr_lsb; /* ( 2.6.32) */ void *si_lower; /* ( 3.19) */ void *si_upper; /* ( 3.19) */ int si_pkey; /* PTE ( 4.6) */ void *si_call_addr; /* ( 3.5) */ int si_syscall; /* ( 3.5) */ unsigned int si_arch; /* ( 3.5) */ } si_signo si_errno si_code . ( si_errno .) "union" : o kill(2) sigqueue(3) si_pid si_uid. sigqueue(3) si_int si_ptr sigqueue(3) . o POSIX.1b ( 2.6) si_overrun si_timerid. si_timerid timer_create(2). si_overrun timer_getoverrun(2). . o ( SIGEV_SIGNAL mq_notify(3)) si_int/si_ptr sigev_value mq_notify(3) si_pid si_uid . o SIGCHLD si_pid si_uid si_status si_utime si_stime . si_pid si_uid . si_status ( si_code CLD_EXITED) . si_utime si_stime CPU ( getrusage(2) times(2)). 2.6 2.6.27 CPU sysconf(_SC_CLK_TCK). 2.6 2.6.27 "system jiffy" ( ) ( time(7)). o SIGILL SIGFPE SIGSEGV SIGBUS SIGTRAP si_addr . si_trapno. SIGBUS BUS_MCEERR_AO BUS_MCEERR_AR si_addr_lsb. . si_addr_lsb log2(sysconf(_SC_PAGESIZE)). SIGTRAP ptrace(2) (PTRACE_EVENT_foo) si_addr si_pid si_uid . seccomp(2) . BUS_MCEERR_* si_addr_lsb . SEGV_BNDERR SIGSEGV si_lower si_upper. SEGV_PKUERR SIGSEGV si_pkey. o SIGIO/SIGPOLL ( ) si_band si_fd. si_band poll(2) revents. si_fd I/O F_SETSIG fcntl(2). o SIGSYS ( 3.5) seccomp SECCOMP_RET_TRAP si_call_addr si_syscall si_arch si_errno seccomp(2). si_code si_code siginfo_t SA_SIGINFO ( ) . ptrace(2) si_code SIGTRAP ptrace : (SIGTRAP | PTRACE_EVENT_foo << 8). ptrace(2) si_code . glibc 2.20 ( ) : o _XOPEN_SOURCE 500 o _XOPEN_SOURCE _XOPEN_SOURCE_EXTENDED o _POSIX_C_SOURCE 200809L . TRAP_* . glibc 2.20 . si_code . SI_USER kill(2). SI_KERNEL . SI_QUEUE sigqueue(3). SI_TIMER POSIX setitimer(2) alarm(2). SI_MESGQ ( 2.6.6) POSIX mq_notify(3). SI_ASYNCIO AIO. SI_SIGIO SIGIO ( 2.2 2.4 SIGIO/SIGPOLL si_code ). SI_TKILL ( 2.4.19) tkill(2) tgkill(2). SI_ASYNCNL . si_code SIGILL: ILL_ILLOPC . ILL_ILLOPN . ILL_ILLADR . ILL_ILLTRP . ILL_PRVOPC . ILL_PRVREG . ILL_COPROC . ILL_BADSTK . si_code SIGFPE: FPE_INTDIV . FPE_INTOVF . FPE_FLTDIV . FPE_FLTOVF . FPE_FLTUND . FPE_FLTRES . FPE_FLTINV . FPE_FLTSUB . FPE_FLTUNK ( 4.17) . FPE_CONDTRAP ( PARISC ) . si_code SIGSEGV: SEGV_MAPERR . SEGV_ACCERR . SEGV_BNDERR ( 3.19) . SEGV_PKUERR ( 4.6) . pkeys(7). si_pkey. SEGV_ACCADI ( 4.17 SPARC ) (ADI) . SEGV_ADIDERR ( 4.17 SPARC ) . SEGV_ADIPERR ( 4.17 SPARC ) . SEGV_MTEAERR ( 5.10 ARM ) (MTE). SEGV_MTESERR ( 5.10 ARM ) (MTE). SEGV_CPERR ( 6.10) . si_code SIGBUS: BUS_ADRALN . BUS_ADRERR . BUS_OBJERR . BUS_MCEERR_AR ( 2.6.32) . BUS_MCEERR_AO ( 2.6.32) . si_code SIGTRAP: TRAP_BRKPT . TRAP_TRACE . TRAP_BRANCH ( 2.4 IA64 ) . TRAP_HWBKPT ( 2.4 IA64 ) / . TRAP_UNK ( 4.18) . TRAP_PERF ( 5.13 2.43) Perf sigtrap=1. si_code SIGCHLD: CLD_EXITED . CLD_KILLED . CLD_DUMPED . CLD_TRAPPED . CLD_STOPPED . CLD_CONTINUED ( 2.6.9) . si_code SIGIO/SIGPOLL: POLL_IN . POLL_OUT . POLL_MSG . POLL_ERR /. POLL_PRI . POLL_HUP . si_code SIGSYS: SYS_SECCOMP ( 3.5 glibc 2.43) seccomp(2). SYS_USER_DISPATCH ( 5.11 glibc 2.43) (Syscall user dispatch). si_code SIGEMT: EMT_TAGOVF (SPARC ) . sigaction() act->sa_flags . 5.11 sigaction() oldact->sa_flags. sigaction() oldact->sa_flags . sa_flags SA_UNSUPPORTED sa_flags. sigaction() . act->sa_flags. SA_NOCLDSTOP SA_NOCLDWAIT SA_SIGINFO SA_ONSTACK SA_RESTART SA_NODEFER SA_RESETHAND SA_RESTORER 5.11. 2.6 2003. SA_UNSUPPORTED. sigaction() 0 -1 errno . EFAULT act oldact . EINVAL . SIGKILL SIGSTOP . C glibc sigaction() (EINVAL) NPTL. nptl(7) . (signal trampoline) C glibc sigaction() act.sa_restorer SA_RESTORER act.sa_flags. sigreturn(2). sigaction(). 2.2 sigset_t (32 ) . rt_sigaction() sigset_t . size_t sigsetsize act.sa_mask oldact.sa_mask. sizeof(sigset_t) ( EINVAL). sigaction() glibc rt_sigaction() . POSIX.1-2024. POSIX.1-2001 SVr4. POSIX.1-1990 SIGCHLD SIG_IGN. POSIX.1-2001 SIGCHLD ( wait(2)). BSD System V SIGCHLD SIGCHLD wait(2) . POSIX.1-1990 SA_NOCLDSTOP . POSIX.1-2001 SA_NOCLDWAIT SA_NODEFER SA_ONSTACK SA_RESETHAND SA_RESTART SA_SIGINFO XSI. POSIX.1-2008 SA_NODEFER SA_RESETHAND SA_RESTART SA_SIGINFO . sa_flags . SA_RESETHAND SVr4 . SA_NODEFER SVr4 1.3.9 . ( sa_mask). fork(2) . execve(2) . POSIX SIGFPE SIGILL SIGSEGV kill(2) raise(3). . SIGFPE. ( -1 SIGFPE). . sigaction() NULL . NULL. SIGKILL SIGSTOP ( sa_mask). . sigsetops(3) . signal-safety(7) (async-signal-safe) . POSIX SI_TIMER timer_create(2). . NetBSD. SA_SIGINFO . sa_handler struct sigcontext uc_mcontext ucontext ( ) sa_sigaction. . . SA_SIGINFO siginfo_t . x86 int ( 3 128) SIGSEGV siginfo_t si_signo si_code ( si_addr SIGSEGV). 2.6.13 ( ) SA_NODEFER sa_flags sa_mask. 2.6.14. mprotect(2). EXIT_SUCCESS SA_EXPOSE_TAGBITS EXIT_FAILURE . #include #include #include #include static 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); } 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) 3 . . : . 6.18 8 2026 sigaction(2)