setjmp(3) - wariua/manpages-ko GitHub Wiki
setjmp, sigsetjmp, longjmp, siglongjmp - λΉμ§μμ goto μννκΈ°
#include <setjmp.h>
int setjmp(jmp_buf env);
int sigsetjmp(sigjmp_buf env, int savesigs);
void longjmp(jmp_buf env, int val);
void siglongjmp(sigjmp_buf env, int val);
glibc κΈ°λ₯ νμΈ λ§€ν¬λ‘ μ건 (feature_test_macros(7) μ°Έκ³ ):
-
setjmp()
: - NOTES μ°Έκ³ .
-
sigsetjmp()
: _POSIX_C_SOURCE
μ΄ νμ΄μ§μμ κΈ°μ νλ ν¨μλ€μ "λΉμ§μμ goto" μν, μ¦ ν ν¨μμμ λ€λ₯Έ ν¨μ λ΄μ 미리 μ ν΄ λ μμΉλ‘ μ€νμ μ΄μ νλ λ° μ΄λ€. setjmp()
ν¨μλ μ΄νμ μ μ΄λ₯Ό μ΄μ ν λͺ©νμ μ λμ μΌλ‘ μ€μ νλ©° longjmp()
λ μ€ν μ΄μ μ μννλ€.
setjmp()
ν¨μλ νΈμΆ νκ²½μ λν λ€μν μ 보(보ν΅μ μ€ν ν¬μΈν°μ μΈμ€νΈλμ
ν¬μΈν°, κ·Έλ¦¬κ³ μλ§λ λ€λ₯Έ λ μ§μ€ν°λ€μ κ°κ³Ό μκ·Έλ λ§μ€ν¬)λ₯Ό λ²νΌ env
μ μ μ₯νμ¬ μ΄νμ longjmp()
κ° μ¬μ©ν μ μκ² νλ€. μ΄ κ²½μ°μ setjmp()
λ 0μ λ°ννλ€.
longjmp()
ν¨μλ env
μ μ μ₯λ μ 보λ₯Ό μ΄μ©ν΄ setjmp()
λ₯Ό νΈμΆνλ μ§μ μΌλ‘ μ μ΄λ₯Ό μ΄μ νκ³ setjmp()
νΈμΆ μμ μ μνλ‘ μ€νμ 볡μ("λκ°κΈ°")νλ€. λλΆμ΄ ꡬνμ λ°λΌμ (NOTES μ°Έκ³ ) λ€λ₯Έ λ μ§μ€ν°λ€μ κ°κ³Ό νλ‘μΈμ€ μκ·Έλ λ§μ€ν¬κ° setjmp()
νΈμΆ μμ μ μνλ‘ λ³΅μλ μλ μλ€.
longjmp()
μ±κ³΅ νμλ setjmp()
κ° λ λ²μ§Έλ‘ λ°νλ κ²μ²λΌ μ€νμ΄ μ΄μ΄μ§λ€. μ΄ "κ°μ§" λ°νμ μ§μ§ setjmp()
νΈμΆκ³Ό ꡬλ³ν μ μλ κ²μ "κ°μ§" λ°νμμλ val
μ μ 곡ν κ°μ λ°ννκΈ° λλ¬Έμ΄λ€. νλ‘κ·Έλλ¨Έκ° μ€μλ‘ val
μ 0 κ°μ μ λ¬νλ©΄ "κ°μ§" λ°νμμλ κ·Έ λμ 1μ λ°ννκ² λλ€.
sigsetjmp()
μ siglongjmp()
μμ λΉμ§μμ gotoλ₯Ό μννλ νλ‘μΈμ€ μκ·Έλ λ§μ€ν¬λ₯Ό μμΈ‘ κ°λ₯νκ² μ²λ¦¬ν΄ μ€λ€.
sigsetjmp()
μκ² μ€ savesigs
μΈμκ° 0μ΄ μλ κ²½μ°μλ, κ·Έλ¦¬κ³ κ·Έ κ²½μ°μλ§ νλ‘μΈμ€μ νμ¬ μκ·Έλ λ§μ€ν¬λ₯Ό env
μ μ μ₯νλ©° μ΄ν μ΄ env
λ‘ siglongjmp()
λ₯Ό μννλ©΄ λ€μ 볡μνκ² λλ€.
setjmp()
μ sigsetjmp()
λ μ§μ νΈμΆ μ 0μ λ°ννλ€. longjmp()
λ siglongjmp()
νμ μΌμ΄λλ "κ°μ§" λ°νμμλ val
λ‘ μ§μ ν 0 μλ κ°μ λ°ννλ€.
longjmp()
λ΄μ§ siglongjmp()
ν¨μλ λ°ννμ§ μλλ€.
μ΄ μ μμ μ¬μ©νλ μ©μ΄λ€μ λν μ€λͺ μ attributes(7)λ₯Ό 보λΌ.
μΈν°νμ΄μ€ | μμ± | κ° |
---|---|---|
setjmp() , sigsetjmp()
|
μ€λ λ μμ μ± | MT-Safe |
longjmp() , siglongjmp()
|
μ€λ λ μμ μ± | MT-Safe |
setjmp()
, longjmp()
: POSIX.1-2001, POSIX.1-2008, C89, C99.
sigsetjmp()
, siglongjmp()
: POSIX.1-2001, POSIX.1-2008.
POSIXμμλ setjmp()
κ° μκ·Έλ λ§μ€ν¬λ₯Ό μ μ₯νκ² λλμ§ (κ·Έλ¦¬κ³ μ΄ν longjmp()
κ³Όμ μμ 볡μνκ² λλμ§) μ¬λΆλ₯Ό λͺ
μΈνκ³ μμ§ μλ€. μμ€ν
Vμμλ κ·Έλ κ² λμ§ μλλ€. 4.3BSDμμλ κ·Έλ κ² λλ©°, λ κ·Έλ κ² λμ§ μλ _setjmp()
ν¨μκ° μλ€. 리λ
μ€μμμ λμ λ°©μμ glibc λ²μ κ³Ό κΈ°λ₯ νμΈ λ§€ν¬λ‘ μ€μ μ λ°λΌ λ¬λΌμ§λ€. 리λ
μ€μμ glibc λ²μ 2.19 μ κΉμ§λ setjmp()
κ° κΈ°λ³Έμ μΌλ‘ μμ€ν
V λμ λ°©μμ λ°λ₯΄λ, _BSD_SOURCE
κΈ°λ₯ νμΈ λ§€ν¬λ‘κ° λͺ
μμ μΌλ‘ μ μλμ΄ μμΌλ©° _POSIX_SOURCE
, _POSIX_C_SOURCE
, _XOPEN_SOURCE
, _GNU_SOURCE
μ€ μ΄λ κ²λ μ μλμ΄ μμ§ μμΌλ©΄ BSD λμ λ°©μμ μ 곡νλ€. glibc 2.19λΆν°λ <setjmp.h>
μμ μμ€ν
V λ²μ μ setjmp()
λ§ λλ¬λΈλ€. BSD λμ λ°©μμ΄ νμν νλ‘κ·Έλ¨μμλ setjmp()
νΈμΆμ savesigs
μΈμκ° 0μ΄ μλ sigsetjmp()
νΈμΆλ‘ κ΅μ²΄ν΄μΌ νλ€.
setjmp()
μ longjmp()
λ κΉμ΄ μ΄μ΄μ§ ν¨μ νΈμΆ λ΄μ μ€λ₯λ₯Ό λ€λ£¨λ λ° μ μ©ν μ μμΌλ©° μκ·Έλ νΈλ€λ¬μμ μ£Ό νλ‘κ·Έλ¨μ΄ μ€λ¨λλ μ§μ μΌλ‘ λμκ°λ λμ νλ‘κ·Έλ¨ λ΄ νΉμ μμΉλ‘ μ μ΄λ₯Ό μ λ¬ν μλ μλ€. νμμμ μκ·Έλ λ§μ€ν¬λ₯Ό μ΄μμ± μκ² μ μ₯ λ° λ³΅μνκ³ μΆλ€λ©΄ sigsetjmp()
μ siglongjmp()
λ₯Ό μ¬μ©νλ©΄ λλ€. μλμ νλ‘κ·Έλ¨ κ°λ
μ±μ λν λ
Όμλ μ°Έκ³ νλΌ.
μ»΄νμΌλ¬κ° λ³μλ€μ λ μ§μ€ν°λ‘ μ΅μ νν μλ μλλ° longjmp()
κ° μ€ν ν¬μΈν°μ νλ‘κ·Έλ¨ μΉ΄μ΄ν°μ λν΄ λ€λ₯Έ λ μ§μ€ν°λ€μ κ°μ 볡μν μλ μλ€. λ°λΌμ λ€μ κΈ°μ€λ€μ λͺ¨λ ν΄λΉνλ κ²½μ°μλ longjmp()
νΈμΆ νμ μλ λ³μμ κ°μ΄ μ ν΄μ Έ μμ§ μλ€.
-
λ³μκ° λμνλ
setjmp()
νΈμΆμ νλ ν¨μμ λ‘컬μ΄λ€. -
κ·Έ κ°μ΄
setjmp()
νΈμΆκ³Όlongjmp()
νΈμΆ μ¬μ΄μμ λ°λλ€. -
volatile
λ‘ μ μΈλμ΄ μμ§ μλ€.
μ μ¬ν λ΄μ©μ΄ siglongjmp()
μλ μ μ©λλ€.
μ€μ© κ°λ₯μ±μ΄ μκΈ°λ νμ§λ§ μ ν΅μ μΈ Cμ "goto" λ¬Έμλ μ μ΄λ μΈμ΄μ μ νΈ(goto λ¬Έκ³Ό λμ λ μ΄λΈ)λ₯Ό ν΅ν΄ νλ‘κ·Έλλ¨Έκ° μ€ν νλ¦μ μ½κ² μΈμν μ μλ€λ μ₯μ μ΄ μλ€. νμ§λ§ λΉμ§μμ gotoμλ κ·Έλ° μ νΈκ° μλ€. μ¬λ¬ setjmp()
νΈμΆλ€μ΄ λμΌν jmp_buf
λ³μλ₯Ό μ΄μ©ν μλ μμ ν
κ³ , κ·Έλ¬λ©΄ κ·Έ λ³μμ λ΄μ©μ΄ μμ©μ μλͺ
λμ λ°λ μλ μλ€. κ·Έλμ νΉμ longjmp()
νΈμΆμ λμ μΈ λμμ μμλ΄κΈ° μν΄ νλ‘κ·Έλλ¨Έκ° μ΄μ© μ μμ΄ μ½λλ₯Ό μμΈν μ½μ΄μΌ ν μλ μλ€. (κ·Έ νλ‘κ·Έλλ¨Έλ₯Ό λμ μ£Όλ €λ©΄ setjmp()
νΈμΆλ§λ€ κ°μμ jmp_buf
λ³μλ₯Ό μ΄μ©νλ κ² μ’λ€.)
λ λμ΄λλ₯Ό μ¬λ¦¬μλ©΄ setjmp()
νΈμΆκ³Ό longjmp()
νΈμΆμ΄ κ°μ μμ€ μ½λ λͺ¨λμ μμ§ μμ μλ μλ€.
μμ½νμλ©΄ λΉμ§μμ gotoλ νλ‘κ·Έλ¨ μ΄ν΄κ³Ό μ μ§ λ³΄μλ₯Ό μ΄λ ΅κ² λ§λ€λ©° κ°λ₯νλ€λ©΄ λ€λ₯Έ λμμ μ¬μ©νλ κ² μ’λ€.
setjmp()
λ₯Ό νΈμΆνλ ν¨μκ° longjmp()
νΈμΆ μ μ λ°ννλ κ²½μ°μ λμ λ°©μμ κ·μ λμ΄ μμ§ μλ€. μ΄λ€ λ―Έλ¬νκ±°λ λ―Έλ¬νμ§ μμ νΌλμ΄ λΆλͺ
ν λ°μνλ€.
λ€μ€ μ€λ λ νλ‘κ·Έλ¨μμ λ€λ₯Έ μ€λ λμμμ setjmp()
νΈμΆλ‘ μ΄κΈ°ν νλ env
λ²νΌλ₯Ό longjmp()
νΈμΆμμ μ¬μ©νλ κ²½μ° κ·Έ λμ λ°©μμ κ·μ λμ΄ μμ§ μλ€.
POSIX.1-2008 κΈ°μ μ μ€ν 2μμ longjmp()
μ siglongjmp()
λ₯Ό λΉλκΈ° μκ·Έλ μμ ν¨μ λͺ©λ‘μ μΆκ°νμλ€. νμ§λ§ κ·Έ νμ€μμλ μκ·Έλ νΈλ€λ¬μμ μ΄ ν¨μλ€μ μ¬μ©μ νΌνκΈ°λ₯Ό κΆνκ³ μμΌλ©° κ³μν΄μ μ§μ νκΈ°λ₯Ό, λΉλκΈ° μκ·Έλ μμ μλ ν¨μμ λν νΈμΆμ μ€λ¨μμΌ°λ μκ·Έλ νΈλ€λ¬μμ (λλ main()
μ λν μ΅μ΄ νΈμΆμμ λ°ν μ μΌμ΄λλ exit(3)μ ν΄λΉνλ λ¨κ³λ€μ²λΌ λλ±ν 무μΈκ°μμ) μ΄ ν¨μλ€μ νΈμΆνλ€λ©΄ νλ‘κ·Έλ¨μμ μ΄ν λΉλκΈ° μκ·Έλ μμ μλ ν¨μλ₯Ό νΈμΆνλ κ²½μ° κ·Έ λμ λ°©μμ΄ κ·μ λμ΄ μμ§ μλ€. μ μ μ λ λμμ νΌν μ μΌν λ°©λ²μ λ€μ μ€ νλλ₯Ό 보μ₯νλ κ²μ΄λ€.
-
μκ·Έλ νΈλ€λ¬λ‘λΆν° κΈ΄ μ νλ₯Ό ν νμλ νλ‘κ·Έλ¨μμ μ΄λ€ λΉλκΈ° μκ·Έλ μμ μλ ν¨μλ νΈμΆνμ§ μκ³
main()
μ λν μ΅μ΄ νΈμΆλ‘λΆν° λ°ννμ§ μλλ€. -
λͺ¨λ λΉλκΈ° μκ·Έλ μμ μλ ν¨μ νΈμΆ λμ νΈλ€λ¬μμ κΈ΄ μ νλ₯Ό μννλ μκ·Έλλ€μ μ°¨λ¨ν΄μΌ νλ©°
main()
μ λν μ΅μ΄ νΈμΆλ‘λΆν° λ°νν νμ μ΄λ€ λΉλκΈ° μκ·Έλ μμ μλ ν¨μλ νΈμΆνμ§ μλλ€.
2017-03-13