sigaltstack(2) System Calls Manual sigaltstack(2) sigaltstack - / (libc -lc) #include int sigaltstack(const stack_t *_Nullable restrict ss, stack_t *_Nullable restrict old_ss); glibc ( feature_test_macros(7)): sigaltstack(): _XOPEN_SOURCE >= 500 || /* glibc 2.12: */ _POSIX_C_SOURCE >= 200809L || /* glibc <= 2.19: */ _BSD_SOURCE sigaltstack() / . ( sigaction(2)) . : 1. . 2. sigaltstack() . 3. sigaction(2) SA_ONSTACK. ss old_ss . NULL. stack_t : typedef struct { void *ss_sp; /* Base address of stack */ int ss_flags; /* Flags */ size_t ss_size; /* Number of bytes in stack */ } stack_t; : ss.ss_flags 0 : SS_AUTODISARM ( Linux 4.7) . . swapcontext(3) . . sigaltstack() EINVAL . ss.ss_sp . ss.ss_sp . ss.ss_size . SIGSTKSZ MINSIGSTKSZ . ss.ss_flags SS_DISABLE. ss.ss_flags ss. old_ss NULL sigaltstack(). old_ss.ss_sp old_ss.ss_size . old_ss.ss_flags : SS_ONSTACK . ( .) SS_DISABLE . SS_AUTODISARM. swapcontext(3). sigaltstack(). SS_AUTODISARM . ss NULL old_ss NULL . sigaltstack() 0 -1 errno . EFAULT ss old_ss NULL . EINVAL ss NULL ss_flags . ENOMEM ss.ss_size MINSIGSTKSZ. EPERM ( ). attributes(7). +------------+------------------------------------+--------------------+ || | | +------------+------------------------------------+--------------------+ |sigaltstack()| | MT-Safe | +------------+------------------------------------+--------------------+ POSIX.1-2024. SS_AUTODISARM . POSIX.1-2001, SUSv2, SVr4. SIGSEGV : SIGSEGV . . setrlimit(RLIMIT_STACK, &rlim). SIGSEGV . . . sigaltstack() . . ( .) . . execve(2) . fork(2) . clone(2) clone CLONE_VM CLONE_VFORK . sigaltstack() sigstack(). glibc sigstack(). sigaltstack(). 4.2BSD sigstack(). . 2.2 ss.sa_flags SS_DISABLE. 2.4 sigaltstack() ss.ss_flags==SS_ONSTACK ss.ss_flags==0 ( SS_ONSTACK ss.ss_flags ). POSIX.1 SS_ONSTACK old_ss.ss_flags. SS_ONSTACK ss.ss_flags : SS_ONSTACK ss.ss_flags. sigaltstack() ( sigaction(2)) SIGSEGV: stack_t ss; ss.ss_sp = malloc(SIGSTKSZ); if (ss.ss_sp == NULL) { perror("malloc"); exit(EXIT_FAILURE); } ss.ss_size = SIGSTKSZ; ss.ss_flags = 0; if (sigaltstack(&ss, NULL) == -1) { perror("sigaltstack"); exit(EXIT_FAILURE); } sa.sa_flags = SA_ONSTACK; sa.sa_handler = handler(); /* Address of a signal handler */ sigemptyset(&sa.sa_mask); if (sigaction(SIGSEGV, &sa, NULL) == -1) { perror("sigaction"); exit(EXIT_FAILURE); } execve(2), setrlimit(2), sigaction(2), siglongjmp(3), sigsetjmp(3), signal(7) 3 . . : . 6.18 8 2026 sigaltstack(2)