table of contents
- bookworm-backports 4.25.1-1~bpo12+1
getcontext(3) | Library Functions Manual | getcontext(3) |
НАИМЕНОВАНИЕ¶
getcontext, setcontext - получить или установить пользовательский контекст
БИБЛИОТЕКА¶
Стандартная библиотека языка C (libc, -lc)
ОБЗОР¶
#include <ucontext.h>
int getcontext(ucontext_t *ucp); int setcontext(const ucontext_t *ucp);
ОПИСАНИЕ¶
В окружении, подобном SysV, существует два типа данных —mcontext_t и ucontext_t, которые определены в файле <ucontext.h> и четыре функции — getcontext(), setcontext(), makecontext(3) и swapcontext(3), которые позволяют контексту пользовательского уровня переключаться между несколькими нитями внутри одного процесса.
Тип mcontext_t является машинно-зависимым и примитивным типом данных. Тип ucontext_t является структурой, которая по крайней мере имеет следующие поля:
typedef struct ucontext_t {
struct ucontext_t *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(3)), в uc_sigmask задаётся список сигналов, которые блокируются в этом контексте (см. sigprocmask(2)), uc_stack — это стек, который используется этим контекстом (см. sigaltstack(2)), а uc_mcontext является машинно-зависимым представлением сохранённого контекста, который содержит регистры вызываемой нити.
The function getcontext() initializes the structure pointed to by ucp to the currently active context.
The function setcontext() restores the user context pointed to by ucp. A successful call does not return. The context should have been obtained by a call of getcontext(), or makecontext(3), or received as the third argument to a signal handler (see the discussion of the SA_SIGINFO flag in sigaction(2)).
Если контекст был получен через вызов getcontext(), то выполнение программы продолжается как если бы этот вызов завершился простым возвратом.
Если контекст был получен через вызов makecontext(3), выполнение программы продолжается с помощью вызова функции func, которая задаётся как второй аргумент вызова makecontext(3). Когда происходит возврат из функции func, выполнение продолжается с поля uc_link структуры ucp, которая задаётся как первый аргумент вызова makecontext(3). Если это поле равно NULL, осуществляется выход из нити.
Если контекст был получен с помощью вызова обработчика сигнала, то старый текст стандарта говорит, что "выполнение программы продолжается с инструкции программы, которая следует за инструкцией, прерванной сигналом". Однако, этот текст был удалён в SUSv2 с вердиктом "результат не определён".
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
When successful, getcontext() returns 0 and setcontext() does not return. On error, both return -1 and set errno to indicate the error.
ОШИБКИ¶
Не определены.
АТРИБУТЫ¶
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
getcontext(), setcontext() | Безвредность в нитях | MT-Safe race:ucp |
СТАНДАРТЫ¶
SUSv2, POSIX.1-2001. В POSIX.1-2008 удалено определение getcontext() со ссылкой на проблемы с переносимостью и рекомендацией переписать приложение с использование нитей POSIX.
ПРИМЕЧАНИЯ¶
The earliest incarnation of this mechanism was the setjmp(3)/ longjmp(3) mechanism. Since that does not define the handling of the signal context, the next stage was the sigsetjmp(3)/ siglongjmp(3) pair. The present mechanism gives much more control. On the other hand, there is no easy way to detect whether a return from getcontext() is from the first call, or via a setcontext() call. The user has to invent their own bookkeeping device, and a register variable won't do since registers are restored.
Если возникнет сигнал, текущий пользовательский контекст сохраняется и для обработчика сигнала ядром создаётся новый контекст. Не выходите из этого обработчика, используя longjmp(3) — неизвестно, что может случиться с контекстами. Вместо этого используйте вызовы siglongjmp(3) или setcontext().
СМОТРИТЕ ТАКЖЕ¶
sigaction(2), sigaltstack(2), sigprocmask(2), longjmp(3), makecontext(3), sigsetjmp(3), signal(7)
ПЕРЕВОД¶
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.
15 декабря 2022 г. | Справочные страницы Linux 6.03 |