Originální popis anglicky:
makecontext, swapcontext - manipulate user contexts
Návod, kniha: POSIX Programmer's Manual
#include <ucontext.h>
void makecontext(ucontext_t *
ucp, void
(*func )(void),
int
argc, ...);
int swapcontext(ucontext_t *restrict
oucp,
const ucontext_t *restrict
ucp);
The
makecontext() function shall modify the context specified by
ucp, which has been initialized using
getcontext(). When this
context is resumed using
swapcontext() or
setcontext(), program
execution shall continue by calling
func, passing it the arguments that
follow
argc in the
makecontext() call.
Before a call is made to
makecontext(), the application shall ensure that
the context being modified has a stack allocated for it. The application shall
ensure that the value of
argc matches the number of arguments of type
int passed to
func; otherwise, the behavior is undefined.
The
uc_link member is used to determine the context that shall be resumed
when the context being modified by
makecontext() returns. The
application shall ensure that the
uc_link member is initialized prior
to the call to
makecontext().
The
swapcontext() function shall save the current context in the context
structure pointed to by
oucp and shall set the context to the context
structure pointed to by
ucp.
Upon successful completion,
swapcontext() shall return 0. Otherwise, -1
shall be returned and
errno set to indicate the error.
The
swapcontext() function shall fail if:
- ENOMEM
- The ucp argument does not have enough stack left to
complete the operation.
The following sections are informative.
The following example illustrates the use of
makecontext():
#include <stdio.h>
#include <ucontext.h>
static ucontext_t ctx[3];
static void
f1 (void)
{
puts("start f1");
swapcontext(&ctx[1], &ctx[2]);
puts("finish f1");
}
static void
f2 (void)
{
puts("start f2");
swapcontext(&ctx[2], &ctx[1]);
puts("finish f2");
}
int
main (void)
{
char st1[8192];
char st2[8192];
getcontext(&ctx[1]);
ctx[1].uc_stack.ss_sp = st1;
ctx[1].uc_stack.ss_size = sizeof st1;
ctx[1].uc_link = &ctx[0];
makecontext(&ctx[1], f1, 0);
getcontext(&ctx[2]);
ctx[2].uc_stack.ss_sp = st2;
ctx[2].uc_stack.ss_size = sizeof st2;
ctx[2].uc_link = &ctx[1];
makecontext(&ctx[2], f2, 0);
swapcontext(&ctx[0], &ctx[2]);
return 0;
}
None.
None.
None.
exit() ,
getcontext() ,
sigaction() ,
sigprocmask()
, the Base Definitions volume of IEEE Std 1003.1-2001,
<ucontext.h>
Portions of this text are reprinted and reproduced in electronic form from IEEE
Std 1003.1, 2003 Edition, Standard for Information Technology -- Portable
Operating System Interface (POSIX), The Open Group Base Specifications Issue
6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics
Engineers, Inc and The Open Group. In the event of any discrepancy between
this version and the original IEEE and The Open Group Standard, the original
IEEE and The Open Group Standard is the referee document. The original
Standard can be obtained online at http://www.opengroup.org/unix/online.html
.