私は昨年、私はユーザコンテキスト(ヘッダucontext.h
で定義)を使ってプロジェクトのスレッドスケジューラ(各スレッドがプロセスをシミュレートしたもの)を実装しました。私は講義に参加していて、ユーザーのコンテキストについて話します。去年このプロジェクトを行ったにもかかわらず、getcontext
システムコールが実際に実際に何をしているのか本当に分かりません。getcontextシステムコール(ucontext.h)は本当に何をしますか?
getcontext
のマニュアルページでは、「ucpが指している構造体を現在アクティブなコンテキストに初期化しています」と記載されています。また、引数がsetcontext
の場合、「ucp引数がgetcontext()で作成された場合、プログラムの実行はgetcontext()の対応する呼び出しが戻ったかのように続きます」さて、私はそれを理解しています。
ここで私は混乱しています。一般的に、私はコンテキストスイッチを実行するために、それを学んだ方法については、一つはそのように設定/ ucontext_t
構造体とスワップを初期化します:
ucontext_t ucp;
ucontext_t oucp;
getcontext(&ucp);
// Initialize the stack_t struct in the ucontext_t struct
ucp.uc_stack.ss_sp = malloc(STACK_SIZE);
ucp.uc_stack.ss_size = STACK_SIZE;
ucp.uc_stack.ss_flags = 0;
ucp.uc_link = /* some other context, or just NULL */;
// Don't block any signals in this context
sigemptyset(&ucp.uc_sigmask);
// Assume that fn is a function that takes 0 arguments and returns void
makecontext(&ucp, fn, 0);
// Perform the context switch. Function 'fn' will be active now
swapcontext(&oucp, &ucp);
// alternatively: setcontext(&ucp);
私は小さなプログラムでgetcontext
を省略すると、興味深い何も起こりません。ユーザーコンテクストを介してより多くのコンテキストを切り替える多少のプログラムでは、getcontext
を追加することで解決されるセグメンテーションフォルトが発生します。
getcontext
とは正確に何ですか?なぜucontext_t
構造体を割り当て、uc_stack
とuc_sigmask
フィールドを初期化して初期化し、getcontext
を除いてmakecontext
を呼び出しても構わないのですか? getcontext
が実行する必要がある初期化がありますか?makecontext
は実行されませんか?
まあ、それはかなりの謎を解決します。 – kibibyte