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.

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

Пример:

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