setjmp(3) Library Functions Manual setjmp(3) setjmp, sigsetjmp, longjmp, siglongjmp - LIBRARY Standard C library (libc, -lc) #include int setjmp(jmp_buf env); int sigsetjmp(sigjmp_buf env, int savesigs); [[noreturn]] void longjmp(jmp_buf env, int val); [[noreturn]] void siglongjmp(sigjmp_buf env, int val); glibc (. feature_test_macros(7)): setjmp(): . sigsetjmp(): _POSIX_C_SOURCE , , << goto>>: . setjmp() , longjmp() . setjmp() (, , , ) env longjmp(). setjmp() 0. longjmp() , env, , setjmp(), (<<>>) setjmp(). , ( ), setjmp(). longjmp() setjmp() . <<>> setjmp(), <<>> , val. 0 val, <<>> 1. sigsetjmp() siglongjmp() sigsetjmp() siglongjmp() , . , , savesigs, sigsetjmp(), , env , siglongjmp() env. setjmp() sigsetjmp() 0, ; <<>> , longjmp() siglongjmp(), , val. longjmp() siglongjmp() . attributes(7). +----------------------------+----------------------------------------------------------+--------------------------+ | | | | +----------------------------+----------------------------------------------------------+--------------------------+ |setjmp(), sigsetjmp() | | MT-Safe | +----------------------------+----------------------------------------------------------+--------------------------+ |longjmp(), siglongjmp() | | MT-Safe | +----------------------------+----------------------------------------------------------+--------------------------+ setjmp() longjmp() C11, POSIX.1-2008. sigsetjmp() siglongjmp() POSIX.1-2008. setjmp() longjmp() POSIX.1-2001, C89. sigsetjmp() siglongjmp() POSIX.1-2001. POSIX does not specify whether setjmp() will save the signal mask (to be later restored during longjmp()). In System V it will not. In 4.3BSD it will, and there is a function _setjmp() that will not. The behavior under Linux depends on the glibc version and the setting of feature test macros. Before glibc 2.19, setjmp() follows the System V behavior by default, but the BSD behavior is provided if the _BSD_SOURCE feature test macro is explicitly defined and none of _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _GNU_SOURCE, or _SVID_SOURCE is defined. Since glibc 2.19, exposes only the System V version of setjmp(). Programs that need the BSD semantics should replace calls to setjmp() with calls to sigsetjmp() with a nonzero savesigs argument. setjmp() longjmp() , . , , sigsetjmp() siglongjmp(). . CAVEATS longjmp() . , longjmp(), : o , setjmp(); o setjmp() longjmp(); o volatile. siglongjmp(). , C <> ( goto ), . : setjmp() jmp_buf, . , longjmp() ( setjmp() jmp_buf). : setjmp() longjmp() . , , , , . Undefined Behavior , setjmp() longjmp(), . ( ) . longjmp() env, setjmp() , . POSIX.1-2008 Technical Corrigendum 2 longjmp() siglongjmp() async-signal-safe. , , async-signal-safe ( , exit(3), main()), , async-signal-safe. , : o - async-signal-safe main(). o , , async-signal-safe async-signal-safe main(). . signal(7), signal-safety(7) Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov ; GNU 3 , . . , , . Linux man-pages 6.06 31 2023 . setjmp(3)