int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);
mcontext_t 型はマシン依存で、外部からは隠蔽されている。 ucontext_t 型は構造体で、少なくとも以下の 4 つのフィールドを持つ。
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 はこのコンテキストが用いているスタックである (signalstack(2) を見よ)。 uc_mcontext は保存されているコンテキストの マシン特有の表現形式であり、 ここには呼び出したスレッドのマシンレジスターが格納される。
getcontext() 関数は、 ポインター ucp が指す構造体を、 現在アクティブなコンテキストに初期化する。
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) の呼び出しによって得られていたものの場合は、 プログラムの実行はその makecontext(3) 呼び出しの第二引数で指定された関数 func を呼び出すかたちで継続する。 func から返ると、 makecontext(3) 呼び出しの第一引数で指定されていた ucp 構造体の uc_link メンバで継続する。 このメンバが NULL だった場合は、そのスレッドは終了する。
コンテキストがシグナルハンドラーの呼び出しによって得られていたものの場合は、 古い標準によれば 「プログラムの実行はシグナルによって割り込まれた命令の次の命令から継続される」。 しかしこの文は SUSv2 で削除されたので、 現在の判断は「結果は定義されていない」である。
インターフェース | 属性 | 値 |
getcontext(), setcontext() | Thread safety | MT-Safe race:ucp |
シグナルが発生すると、 現在のユーザーコンテキストは保存され、 シグナルハンドラー用のコンテキストがカーネルによって生成される。 今後はハンドラーに longjmp(3) を使わせないこと: この関数のコンテキスト下での動作は定義されていない。 代わりに siglongjmp(3) か setcontext() を使うこと。