機能のLinuxのucontext家族

入門

このようなプログラム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採用すべきgetcontextmakecontext作りました。プログラムが経由の場合は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
...

おすすめ

転載: www.cnblogs.com/zuofaqi/p/12347759.html