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

       

Setjmp



     setjmp

Функция Устанавливает нелокальный переход.

Синтаксис #include

int setjmp(jmp_buf jmpb);

Файл, содержащий setjmp.h прототип

Описание setjmp захватывает состояние задачи в jmpb и воз- вращает 0.

Последующий вызов longjmp восстанавливает состоя- ние задачи из jmpb и возвращается также как и setjmp со значением val.

Cостояние задачи представляет собой следующее:

- все сегментные регистры (CX,DS,ES,SS); - переменные-регистры (SI,DI); - указатель стека (SP); - указатель базы (BP); - флаги.

Состояние задачи является достаточно полным, так что функции setjmp и longjmp могут быть использо- ваны как инструмент для организации сопрограмм.

Перед использованием функции longjmp необходимо вызвать функцию setjmp. Программа вызывающая setjmp и устанавливающая jmpb должна оставаться активной и не должна возвращать управления до вы- зова longjmp. Если это случится, то результат непредсказуем.

Данные подпрограммы могут быть полезны для работы с ошибками и исключительными ситуациями, происхо- дящими в низкоуровневых подпрограммах прикладных программ.

Примечание. Функции setjmp и longjmp нельзя ис- пользовать для реализации оверлейных программ. Обычно setjmp и longjmp сохраняют и восстананав- ливают все, необходимые для реализации сопрог- рамм, однако для управления оверлеями необходимо следить за стеком, причем подразумевается, что стек один. При реализации сопрограмм вы обычно используете два стека, или две части одного сте- ка, и поэтому администратор оверлеев не сможет корректно их отслеживать.

Вы можете иметь задачи, работающие в фоновом ре- жиме, которые используют свой стек, или свой раз- дел общего стека, однако вы должны быть уверены, что они не используют оверлеев, и вы не должны использовать оверлейные версии setjmp и longjmp для переключения на эти фоновые задачи.

Возвращаемое setjmp возвращает 0 при начальном вызове. значение Если это вызов для возврата после longjmp, setjmp возвращает ненулевое значение (как в примере).

Переносимость Функция поддерживаются на системах UNIX и стандар- том ANSI C.

Смотрите также

Пример:

#include

#include

#include



void subroutine(void);

imp_buf jumper;

int main() { int value; value = setjmp(jumper); if (value != 0) { printf("longjmp со значением %d\n", value); exit(value); } printf("Вызов подпрограммы ... \n"); subroutine(); return 0; } void subroutine(void) { longjmp(jumper,l); }



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