Функция Выполняет нелокальный переход.
Синтаксис #include
void longjmp(jmp_buf jmpb, int retval);
Файл, содержащий setjmp.h
прототип
Описание Вызов функции longjmp восстанавливает состояние
задачи, которое было установлено при последнем
вызове функции setjmp с аргументом jmpb. Затем
она возвращает значение retval также,как и функ-
ция setjmp.
Cостояние задачи представляет собой следующее:
- все сегментные регистры (CX,DS,ES,SS);
- переменные-регистры (SI,DI);
- указатель стека (SP);
- указатель базы (BP);
- флаги.
Состояние задачи является достаточно полным, так
что функции setjmp и longjmp могут быть использо-
ваны как инструмент для организации сопрограмм.
Данные подпрограммы могут быть полезны для работы
с ошибками и исключительными ситуациями, происхо-
дящими в низкоуровневых подпрограммах прикладных
программ.
Перед использованием функции longjmp необходимо
вызвать функцию setjmp. Программа вызывающая
setjmp и устанавливающая jmpb должна оставаться
активной и не должна возвращать управления до вы-
зова longjmp. Если это случится, то результат
непредсказуем.
longjmp не может посылать значение 0. Если 0 по-
сылается в retval, то он заменяется на 1.
Примечание. Функции setjmp и longjmp нельзя ис-
пользовать для реализации оверлейных программ.
Обычно setjmp и longjmp сохраняют и восстананав-
ливают все, необходимые для реализации сопрог-
рамм, однако для управления оверлеями необходимо
следить за стеком, причем подразумевается, что
стек один. При реализации сопрограмм вы обычно
используете два стека, или две части одного сте-
ка, и поэтому администратор оверлеев не сможет
корректно их отслеживать.
Вы можете иметь задачи, работающие в фоновом ре-
жиме, которые используют свой стек,или свой раз-
дел общего стека, однако вы должны быть уверены,
что они не используют оверлеев, и вы не должны
использовать оверлейные версии setjmp и longjmp
для переключения на эти фоновые задачи.
Возвращаемое Нет.
значение
Переносимость Функция поддерживаются на системах UNIX
и стандартом ANSI C.
Смотрите также ctrlbrksetjmpsignal
Пример:
#include
#include
int main(void)
{
jmp_buf jumper;
int value;
value = setjmp(jumper);
if (value != 0) {
printf("longjmp со значением %d\n", value);
exit(value);
}
printf("Вызов подпрограммы ... \n");
subroutine();
}
subroutine()
{
longjmp(jumper,l);
}
Вывод:
Вызов подпрограммы ...
Longjmp со значением l