longjmp()

Восстановить состояние окружения, сохраненное функцией setjmp()

Прототип:

#include <setjmp.h>
void longjmp( jmp_buf env,
int return_value );

Аргументы:

env
Состояние окружения, сохраненное последним вызовом setjmp().
return_value
Значение, которое функция setjmp() возвращает.

Библиотека:

libc

Описание:

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


Note: Использование 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() безопасна для сигналов на других платформах.


Warning: Крайне не рекомендуется использовать longjmp() или siglongjmp() для восстановления состояния окружения, сохраненного вызовом setjmp() или sigsetjmp() в другом потоке. Так как приложение выйдет из строя или будет отрабатывать, до тех пор, пока случайные значения в стеке не приведут к сбою.

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

setjmp(), siglongjmp(), sigsetjmp()




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