Восстановить состояние окружения, сохраненное функцией setjmp()
#include <setjmp.h>void longjmp( jmp_buf env,int return_value );
libc
Функция longjmp() восстанавливает состояние окружения, сохраненное в env, путем последнего вызова функции setjmp().
![]() | Использование longjmp() для выхода из обработчика сигнала может вызвать непредсказуемое поведение, если только сигнал не был сгенерирован функцией raise(). |
После того, как функция longjmp() восстанавливает состояние окружения, выполнение программы продолжается, как если бы соответствующий вызов setjmp() только что вернул значение, указанное в return_value. Если значение return_value равно 0
, возвращается значение 1
.
#include <stdio.h>#include <stdlib.h>#include <setjmp.h>jmp_buf env;void rtn( void ){printf( "about to longjmp\n" );longjmp( env, 14 );}int main( void ){int ret_val = 293;if ( 0 == ( ret_val = setjmp( env ) ) ){printf( "after setjmp %d\n", ret_val );rtn();printf( "back from rtn %d\n", ret_val );} else {printf( "back from longjmp %d\n", ret_val );}return (EXIT_SUCCESS);}
Код генерирует следующий вывод:
$ ./a.out after setjmp 0 about to longjmp back from longjmp 14
ANSI, POSIX 1003.1
Приложение, строго соответствующее требованиям POSIX, не должно предполагать, что функция longjmp() безопасна для сигналов на других платформах.
![]() | Крайне не рекомендуется использовать longjmp() или siglongjmp() для восстановления состояния окружения, сохраненного вызовом setjmp() или sigsetjmp() в другом потоке. Так как приложение выйдет из строя или будет отрабатывать, до тех пор, пока случайные значения в стеке не приведут к сбою. |
setjmp(), siglongjmp(), sigsetjmp()
Предыдущий раздел: Описание API системной библиотеки