SETJMP(3C) SETJMP(3C) НАЗВАНИЕ setjmp, longjmp - нелокальная передача управления СИНТАКСИС |#include | |int setjmp (env) |jmp_buf env; | |void longjmp (env, val) |jmp_buf env; |int val; ОПИСАНИЕ Описываемые функции полезны при обработке ошибок и пре- рываний, случившихся на одном из нижних уровней прог- раммной системы. Функция setjmp сохраняет текущее стековое окружение в массиве env (тип jmp_buf определен во включаемом файле ) для последующего использования функцией longjmp. Результат функции setjmp равен 0. Функция longjmp восстанавливает окружение, сохраненное при последнем вызове setjmp с соответствующим аргумен- том env. После завершения longjmp выполнение программы продолжается так, как будто соответствующий вызов setjmp только что вернул значение val. Отметим, что в промежутке между обращениями к setjmp и longjmp не должно быть возврата из функции, вызывавшей setjmp. С помощью функции longjmp невозможно вернуть нулевое значение. Если при вызове longjmp аргумент val равен 0, setjmp все равно вернет 1. Тем самым всегда есть воз- можность отличить естественный возврат из функции setjmp от искусственного, ставшего результатом выполне- ния longjmp. Значения всех глобальных объектов в момент искусственного возврата из setjmp, естественно, те же, что и в момент вызова longjmp. Значения локальных объ ектов соответствуют экземпляру функции, вызвавшей setjmp. ПРИМЕР |#include | |jmp_buf env; |int i=0; |main () |{ | void exit (); | | if (setjmp (env) != 0) { | (void) printf ( | "Значение i при 2-ом возврате из setjmp: %d\n",i); | exit (0); | } | (void) printf ( | "Значение i при 1-ом возврате из setjmp: %d\n",i); | i = 1; | g(); | /* Недостижимый фрагмент */ |} |g() |{ | longjmp (env, 1); | /* Недостижимый фрагмент */ |} Результаты выполнения этой программы после компиляции с языка C будут следующими: |Значение i при 1-ом возврате из setjmp: 0 |Значение i при 2-ом возврате из setjmp: 1 СМ. ТАКЖЕ signal(2). ПРЕДОСТЕРЕЖЕНИЯ Если при обращении к функции longjmp передается аргу- мент env, не заполненный setjmp, или последний вызов setjmp был в функции, из которой уже произошел возврат, то Вам гарантируется абсолютный хаос.