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