Longjmp
longjmp
Функция Выполняет нелокальный переход.
Синтаксис #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.
Смотрите также
Пример:
#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