Функция Устанавливает нелокальный переход.
Синтаксис #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.
Смотрите также longjmpsignal
Пример:
#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);
}