CodeNet / Языки программирования / C / C++ / Linux/Unix / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
setjmp
SETJMP
#include<setjmp.h>
int setjmp(env);
jmp_buf env; переменная, в которой
хранится окружение.
Описание.
Функция setjmp сохраняет состояние стека, который может
быть последовательно восстановлен посредством использования функ-
ции longjmp.
Функции setjmp и longjmp обеспечивают возможность выполне-
ния нелокального (nonlocal) перехода и обычно используются для
передачи управления к обработке ошибок для восстановления кода в
ранее вызванной процедуре (без использования обычного вызова),
для возврата условных обозначений. Вызов setjmp активизирует сох-
ранение текущего состояния стека в env. Последующий вызов longjmp
восстанавливает сохраненное состояние и возвращает управление на
указатель (точку входа), непосредственно следующий за соответст-
вующим вызовом setjmp. Когда вызывается функция longjmp, значения
всех переменных (за исключением переменных регистра) становятся
доступными для процедуры, которая принимает управление и содержит
значения этих переменных. Значения переменных регистра непредска-
зуемы.
Возвращаемое значение.
После сохранения состояния стека функция setjmp возвращает
значение 0. Если в результате вызова longjmp возвращается setjmp,
тогда возвращается и значение value аргумента longjmp. Возвращае-
мого значения в случае ошибки нет.
См. также longjmp.
Замечание. После выполнения longjmp значения переменных ре-
гистра в процедуре, вызывающей setjmp, не могут быть восстановле-
ны (возвращены) к собственным значениям.
Пример:
#include <stdio.h>
#include <setjmp.h>
jmp_buf mark;
main()
{
if (setjmp(mark) != 0)
{ printf("longjmp has been called\n");
recover();
exit(1);
}
printf("setjmp has been called\n");
.
.
.
p();
.
.
.
}
p()
{
int error = 0;
.
.
.
if (error != 0)
longjmp(mark, -1);
.
.
.
}
recover()
{
/* при выходе из программы убедитесь, что файлы данных не
будут запорчены */
.
.
.
}.
