コンテキスト切り替えを楽しんでいます。サンプルコードをファイルhttp://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.htmlにコピーしました
OSX用のマクロ_XOPEN_SOURCEを定義しました。
#define _XOPEN_SOURCE
#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;
}
私はそれを構築します
gcc -o コンテキスト context.c -g
get、make、swap コンテキストが非推奨になっていることについて私に翼をつけます。うーん。
実行するとハングします。クラッシュしないようです。ハングするだけです。
gdb を使用してみましたが、一度 swapcontext に入ると空白になります。f1にはジャンプしません。Enterキーを押し続けると、カーソルがコンソールの新しい行に移動するだけですか?
何が起こっているのか分かりますか?Mac/deprecate メソッドでの作業と何か関係がありますか?
ありがとう