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.

 Смотрите также     ctrlbrk setjmp signal

 Пример:

 #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