sigaltstack(2) - wariua/manpages-ko GitHub Wiki
sigaltstack - μκ·Έλ μ€ν λ¬Έλ§₯ μ€μ νκ³ μ»κΈ°
#include <signal.h>
int sigaltstack(const stack_t *ss, stack_t *old_ss);
glibc κΈ°λ₯ νμΈ λ§€ν¬λ‘ μ건 (feature_test_macros(7) μ°Έκ³ ):
sigaltstack()
-
_XOPEN_SOURCE >= 500
|| /* glibc 2.12λΆν°: */ _POSIX_C_SOURCE >= 200809L
|| /* glibc λ²μ <= 2.19: */ _BSD_SOURCE
sigaltstack()
μ ν΅ν΄ νλ‘μΈμ€μμ μ λ체 μκ·Έλ μ€νμ μ§μ νκ³ κΈ°μ‘΄ λ체 μκ·Έλ μ€νμ μνλ₯Ό μ»μ΄ μ¬ μ μλ€. μκ·Έλ νΈλ€λ¬ μ€μ μμ μμ²νλ©΄ μκ·Έλ νΈλ€λ¬ μ€ν λμ λ체 μκ·Έλ μ€νμ μ¬μ©νλ€.
λ체 μκ·Έλ μ€ν μ¬μ©μ μν μΌλ°μ μΈ μ μ°¨λ λ€μκ³Ό κ°λ€.
- λ체 μκ·Έλ μ€νμ μ¬μ©ν λ©λͺ¨λ¦¬ μμμ ν λΉνλ€.
-
sigaltstack()
μ μ¬μ©ν΄ λ체 μκ·Έλ μ€νμ μ‘΄μ¬μ μμΉλ₯Ό μμ€ν μκ² μλ¦°λ€. -
sigaction(2)μΌλ‘ μκ·Έλ νΈλ€λ¬λ₯Ό μ€μ ν λ
SA_ONSTACK
νλκ·Έλ₯Ό μ§μ ν΄μ μκ·Έλ νΈλ€λ¬λ₯Ό λ체 μκ·Έλ μ€ν μμμ μ€νν΄μΌ ν¨μ μμ€ν μκ² μλ¦°λ€.
ss
μΈμλ μ λ체 μκ·Έλ μ€νμ μ§μ νλλ° μ¬μ©νλ©° old_ss
μΈμλ νμ¬ μ€μ λ μκ·Έλ μ€νμ λν μ 보λ₯Ό μ»λ λ° μ¬μ©νλ€. μ΄ μ€ ν κ°μ§ μμ
λ§ μννκ³ μΆλ€λ©΄ λ€λ₯Έ μΈμλ₯Ό NULLλ‘ μ§μ ν μ μλ€.
μ΄ ν¨μ μΈμλ€μ νμ
μΈ stack_t
νμ
μ λ€μκ³Ό κ°μ΄ μ μλμ΄ μλ€.
typedef struct {
void *ss_sp; /* μ€νμ κΈ°μ€ μ£Όμ */
int ss_flags; /* νλκ·Έ */
size_t ss_size; /* μ€νμ λ°μ΄νΈ μ */
} stack_t;
μ λ체 μκ·Έλ μ€νμ μ€μ νλ €λ©΄ μ΄ κ΅¬μ‘°μ²΄μ νλλ₯Ό λ€μκ³Ό κ°μ΄ μ€μ νλ€.
ss.ss_flags
-
μ΄ νλλ 0 λλ λ€μ νλκ·Έλ₯Ό λ΄λλ€.
-
SS_AUTODISARM
(리λ μ€ 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-2001, POSIX.1-2008, SUSv2, SVr4
SS_AUTODISARM
νλκ·Έλ 리λ
μ€ νμ₯μ΄λ€.
λ체 μκ·Έλ μ€νμ κ°μ₯ νν μ°λ κ³³μ μ μμ μΈ νλ‘μΈμ€ μ€νμ μ¬μ© κ°λ₯ 곡κ°μ΄ κ³ κ°λ κ²½μ° λ°μνλ SIGSEGV
μκ·Έλμ λ€λ£° λμ΄λ€. νλ‘μΈμ€ μ€ν μμμ SIGSEGV
μ λν μκ·Έλ νΈλ€λ¬λ₯Ό νΈμΆν μ μλ μ΄λ° κ²½μ°λ₯Ό λ€λ£¨λ €λ©΄ λ체 μκ·Έλ μ€νμ μ¬μ©ν΄μΌ νλ€.
νλ‘μΈμ€κ° νμ€ μ€νμ κ³ κ°μν¬ μλ μλ€κ³ μμλλ€λ©΄ λ체 μκ·Έλ μ€νμ μ€μ νλ κ²μ΄ μ μ©νλ€. μλ₯Ό λ€λ©΄ μλ‘ μλΌλ νκ³Ό λ§μ£ΌμΉ μ λλ‘ μ€νμ΄ ν¬κ² μλΌκ±°λ setrlimit(RLIMIT_STACK, &rlim)
νΈμΆλ‘ μ€μ ν μ νμ λλ¬νμ¬ κ·Έλ° μν©μ΄ λ°μν μ μλ€. νμ€ μ€νμ΄ κ³ κ°λλ©΄ 컀λμ΄ νλ‘μΈμ€μκ² SIGSEGV
μκ·Έλμ 보λΈλ€. μ΄λ° μν©μμ κ·Έ μκ·Έλμ μ‘μ μ μΌν λ°©λ²μ΄ λ체 μκ·Έλ μ€νμ΄λ€.
리λ
μ€κ° μ§μνλ νλμ¨μ΄ μν€ν
μ²λ€ λλΆλΆμμλ μ€νμ΄ μλλ‘ μλλ€. sigaltstack()
μμλ μ€ν μ±μ₯ λ°©ν₯μ μλμΌλ‘ κ³ λ €ν΄ μ€λ€.
λ체 μκ·Έλ μ€νμμ μ€ν μ€μΈ μκ·Έλ νΈλ€λ¬μμ νΈμΆνλ ν¨μλ€ μμ κ·Έ λ체 μκ·Έλ μ€νμ μ¬μ©νκ² λλ€. (νλ‘μΈμ€κ° λ체 μκ·Έλ μ€νμμ μ€ν μ€μΈ λμ λ€λ₯Έ μκ·Έλμ λν νΈλ€λ¬κ° νΈμΆλλ κ²½μ°λ λ§μ°¬κ°μ§μ΄λ€.) νμ€ μ€νκ³Ό λ¬λ¦¬ μμ€ν μμ λ체 μκ·Έλ μ€νμ μλμΌλ‘ λμ¬ μ£Όμ§ μλλ€. λ체 μκ·Έλ μ€νμ ν λΉλ ν¬κΈ°λ₯Ό λμ΄μλ©΄ μμ λΆκ°λ₯ν κ²°κ³Όλ₯Ό μ λ°νκ² λλ€.
execve(2) νΈμΆ μ±κ³΅ μ κΈ°μ‘΄ λ체 μκ·Έλ μ€νμ΄ μμΌλ©΄ μ κ±°νλ€. fork(2)λ‘ μμ±ν μμ νλ‘μΈμ€λ λΆλͺ¨μ λ체 μκ·Έλ μ€ν μ€μ 볡μ¬λ³Έμ λ¬Όλ €λ°λλ€.
sigaltstack()
μ μ΄μ μ sigstack()
νΈμΆμ λμ νλ€. νμ νΈνμ±μ μν΄ glibcμμλ sigstack()
λ μ 곡νλ€. μλ‘μ΄ μμ©λ€μ λͺ¨λ sigaltstack()
μ μ΄μ©ν΄ μμ±νλ κ² μ’λ€.
4.2BSDμ sigstack()
μμ€ν
νΈμΆμ΄ μμλ€. μ΄μ§ λ€λ₯Έ ꡬ쑰체λ₯Ό μ¬μ©νλλ° νΈμΆμκ° μ€ν μ±μ₯ λ°©ν₯μ μκ³ μμ΄μΌ νλ€λ μ¬κ°ν λ¨μ μ΄ μμλ€.
λ€μ μ½λ μ‘°κ°μ 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(); /* μκ·Έλ νΈλ€λ¬ μ£Όμ */
sigemptyset(&sa.sa_mask);
if (sigaction(SIGSEGV, &sa, NULL) == -1) {
perror("sigaction");
exit(EXIT_FAILURE);
}
리λ
μ€ 2.2 μ΄μ μμ ss.sa_flags
μ μ§μ ν μ μλ μ μΌν νλκ·Έλ SS_DISABLE
μ΄μλ€. 리λ
μ€ 2.4 컀λ 릴리μ€κΉμ§ κ³Όμ μμ λκ΅°κ° λ΄μ©μ νΌλνμ¬ μ»€λμ΄ ss.ss_flags
μμ SS_ONSTACK
μ λ°μλ€μ΄λλ‘ νλ€. μ΄λ κ² νμ λμ λμ λ°©μμ ss_flags
κ° 0μΌ λμ κ°λ€. λ€λ₯Έ ꡬνλ€μμ, κ·Έλ¦¬κ³ POSIX.1μ λ°λ₯΄λ©΄ SS_ONSTACK
μ old_ss.ss_flags
μμ μλ €μ£Όλ νλκ·Έλ‘λ§ λ±μ₯νλ€. ss.ss_flags
μμ μ΄ νλκ·Έλ₯Ό μ§μ ν νμκ° μ ν μλ€. (κ·Έλ¦¬κ³ μ¬μ€ κ·Έλ κ² νλ©΄ μ΄μμ±μ΄ λ¨μ΄μ§λ€. μ΄λ€ ꡬνλ€μμλ ss.ss_flags
μ SS_ONSTACK
μ μ§μ νλ©΄ μ€λ₯λ₯Ό λ±κΈ° λλ¬Έμ΄λ€.)
execve(2), setrlimit(2), sigaction(2), siglongjmp(3), sigsetjmp(3), signal(7)
2017-11-08