Описание функций Си

       

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



Содержание раздела