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); }