Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

Setjmp

CuBook05

Функция

Устанавливает нелокальный переход.
 
Синтаксис

#include <setjmp.h>
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. Функция не совместима с Windows.
 
Пример

#include <stdio.h>
#include <process.h>
#include <setjmp.h>

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);
}
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Защитный код Обновить