MAN getcontext 2
Материал из Gentoo Linux Wiki
- Вернуться в раздел мануалов
Содержание |
[править] Имя
getcontext, setcontext - получить или установить пользовательский контекст
[править] Обзор
#include <ucontext.h>
int getcontext(ucontext_t * ucp );
int setcontext(const ucontext_t * ucp );
[править] Описание
В окружение подобном SysV, существует два типа данных mcontext_t и ucontext_t, которые определены в файле <ucontext.h> и четыре функции getcontext(), setcontext(), makecontext() и swapcontext(), которые позволяют контексту пользовательского уровня переключаться между несколькими нитями (тредами) внутри одного процесса.
Тип mcontext_t является машинно-зависимым и примитивным типом данных. Тип ucontext_t является структурой, которая по крайней мере имеет следующие поля:
typedef struct ucontext {
struct ucontext *uc_link;
sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
...
} ucontext_t;
где sigset_t и stack_t определены в файле
<signal.h> .
В этой структуре, uc_link указывает на контекст, к которому будет
осуществлён переход, когда завершается текущий контекст (в случае,
если текущий контекст был создан с помощью makecontext()),
uc_sigmask является списком сигналов, которые блокируются в
этом контексте (см.
sigprocmask (2)),
uc_stack - это стек, который используется этим котекстом (см.
sigaltstack (2))
и uc_mcontext является
машинно-специфическим представлением сохранённого контекста,
который включает регистры вызываемой нити.
Функция getcontext() инициализирует вышеописанную структуру, указывая через ucp на текущий активный контекст.
Функция setcontext() восстанавливает пользовательский контекст, на который указывает ucp. Успешный вызов не возвращает ничего. Контекст должен быть получен с помощью вызова getcontext() или makecontext(), или передан как третий аргумент обработчика сигнала.
Если контекст был получен через вызов getcontext(), выполнение программы продолжается как если бы этот вызов завершился простым возвратом.
Если контекст был получен через вызов makecontext(), выполнение программы продолжается с помощью вызова функции func, которая задаётся как второй аргумент вызова makecontext(). Когда происходит возврат из функции func, выполнение продолжается с поля uc_link структуры ucp, которая задаётся как первый аргумент вызова makecontext(). Если это поле равно NULL, осуществляется выход из нити.
Если контекст был получен с помощью вызова обработчика сигнала, то старый текст стандарта говорит, что "выполнение программы продолжается с инструкции программы, которая следует за инструкцией, прерванной сигналом". Однако, этот текст был удален в SUSv2 в вердиктом "результат неопределён".
[править] Возвращаемое значение
В случае успеха, getcontext() возвращает 0, а setcontext() не возвращает ничего. В случае ошибки, возвращается -1 и значение errno устанавливается соответствующим образом.
[править] Ошибки
Не определены.
[править] Замечания
В ранних версиях этого механизма использовался механизм setjmp()/longjmp(). В нём не было определено управление контекстом сигнала, что было решено в следущем варианте парой sigsetjmp()/siglongjmp(). Текущий механизм даёт много больше контроля. С другой стороны, не существует лёгкого способа определить какое из двух значений возвращает при первом запуске вызов getcontext() или вызов setcontext(). Пользователь имеет должен придумать собственный способ и регистровую переменную, которая должна сохраняется когда восстанавливаются значения регистров.
Если возникнет сигнал, текущий пользовательский контекст сохраняется и для обработчика сигнала ядром создаётся новый контекст. Не выходите из этого обработчика, используя longjmp() - неизвестно, что может случиться с контекстами. Вместо этого используйте вызовы siglongjmp() или setcontext().
[править] Соответствие стандартам
SUSv2
[править] Смотри также
sigaction (2), sigaltstack (2), sigprocmask (2), longjmp (3), sigsetjmp (3), makecontext (3)
[править] Перевод
Перевёл с английского Виктор Вислобоков <corochoone@perm.ru> 2005
[править] Комментарии к man файлу
Copyright (C) 2001 Andries Brouwer (aeb@cwi.nl)
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one
Since the Linux kernel and libraries are constantly changing, this
manual page may be incorrect or out-of-date. The author(s) assume no
responsibility for errors or omissions, or for damages resulting from
the use of the information contained herein. The author(s) may not
have taken the same level of care in the production of this manual,
which is licensed free of charge, as they might when working
professionally.
Formatted or processed versions of this manual, if unaccompanied by
the source, must acknowledge the copyright and authors of this work.
Дата последней коррекции перевода 11.03.2005
Перевод с английского сделал Виктор Вислобоков <corochoone@perm.ru>
http://www.linuxshare.ru/projects/trans/mans.html
