入門
このようなプログラムucontext Linuxは、それによってスイッチングスタックへの切り替えプロセスまたはスレッドスイッチユーザ空間を避け、ユーザモードコンテキストスイッチに、従って、比較的高い効率を実行してもよいです。
構造
そこ二つの構造は、それぞれ、mcontext_t
及びucontext_t
そのmcontext_t
透明です。私達はちょうど集中する必要がありucontext_t
、その上に
ucontext_t
ヘッダファイルに定義されているucontext.h
ために、:
/* Userlevel context. */
typedef struct ucontext_t
{
unsigned long int __ctx(uc_flags);
struct ucontext_t *uc_link;
stack_t uc_stack;
mcontext_t uc_mcontext;
sigset_t uc_sigmask;
struct _libc_fpstate __fpregs_mem;
} ucontext_t;
キーフィールド説明:
uc_link
:文脈で、実行後の現在のコンテキストが実行される場合uc_link
、空の後、プログラムを終了し、現在のコンテキストを実行します。
uc_stack
:スタックに必要なコンテキスト。
uc_sigmask
:プロセスの実行コンテキストは、集合信号をマスクする、すなわち、シグナルマスク。
uc_mcontext
:保存し、そのような値PCの値として、特定のプログラムの実行、およびスタック・ポインタ・レジスタの内容。その実装は、ハードウェアプラットフォームに関連する、そのため不透明され、地上階に依存します。
機能
4つの機能があります。
int getcontext(ucontext_t *ucp);
初期化ucp
構造に記憶されている現在のコンテキストucp
。成功した場合、0を返し、エラー-1を返して、errno
int setcontext(const ucontext_t *ucp);
設定し、現在のコンテキストucp
のコンテキストを指摘しました。setcontext
コンテキストをucp
採用すべきgetcontext
かmakecontext
作りました。プログラムが経由の場合はgetcontext
、取得、プログラムは呼び出しを続行します。文脈が通っている場合makecontext
、取得、プログラム呼び出しmakecontext
、その後、関数を返した場合、回復ucp-> uc_linkに機能する第2のパラメータポイントの機能を、場合ucp-> uc_linkには、空の、出口スレッドです。呼び出しが成功し、新しいコンテキストに切り替えると、戻りません。復帰に失敗しました-1。
void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);
ucontext_tを初期化、変更することによってgetcontext
コンテキストを(したがって、取得したmakecontext
呼び出しに必要前にgetcontext
)、スタック領域が設けられているuc_stack
と、後続の文脈uc_link
。
int swapcontext(ucontext_t *oucp, const ucontext_t *ucp);
現在のコンテキスト保存するoucp
構造をして、活性化させるucp
構造を。成功は、返すために失敗を返さない場合は-1
例
#include <stdio.h>
#include <ucontext.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main()
{
ucontext_t context;
if (getcontext(&context))
{
perror("getcontext");
return -1;
}
puts("hello");
sleep(1);
if (setcontext(&context))
{
perror("setcontext");
return -1;
}
return 0;
}
出力は次のようになります。
hello
hello
hello
...