setjmp()

Сохранить окружение вызова для longjmp()

Прототип:

#include <setjmp.h>
int setjmp( jmp_buf env );

Аргументы:

env
Буфер, в котором функция сохранит окружение вызова.

Библиотека:

libc

Описание:

Функция setjmp() сохранит окружение вызова в параметре env для дальнейшего использования функцией longjmp().

С помощью функции setjmp() может быть реализована обработка ошибок с помощью сохранения точки возвращения после ошибки. В случае, если в функции обнаруживается ошибка, то эта функция использует longjmp() для возврата к сохраненной точке. При этом вызвавшая setjmp() функция должна оставаться активной (т.е. не должно быть возврата к вызвавшей ее функции).

При использовании данной функции необходимо убедиться, что все ресурсы (выделенная память, открытые файлы и т.п.) были освобождены.


Warning: Нельзя использовать функции 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

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

longjmp()




Предыдущий раздел: Описание API системной библиотеки