Восстановить состояние окружения, сохраненное функцией 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 системной библиотеки