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 был в функции, из которой уже произошел возврат,
то Вам гарантируется абсолютный хаос.
|