私はコンテキスト切り替えで面白いです。私は例のコードをファイルにコピーしました。 http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.htmlコンテキスト切り替え - makecontextとswapcontextがここで動作していますか(OSX)
と私は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
winges程度にし、取得するには、廃止予定されているスワップコンテキストを構築します。 Meh。
私はそれを実行するだけでハングアップします。それはクラッシュするようではありません。それはちょうどハングアップします。
私はgdbを使ってみましたが、一度swapcontextに入ると、空白になります。それはf1にジャンプしません。私はちょうど入力して打つと、それはコンソール上の新しい行にカーソルを移動しますか?
何が起こっているのでしょうか? Mac/deprecateメソッドで作業することと何か?
おかげ
それはあなたのコードのように見える
結構です。なぜそれはそれを修正しましたか?何がスタックサイズを増やすと思いましたか? – Prof
@Prof - 私は正常にos xの前にucontextを使ってコードを実行していることを知っていたので、あなたのサンプルコードが私のLinuxボックスでは動作しましたが、os xではなく、スタックサイズが最も有望な原因でした。 – DaoWen
@Prof - もう少し掘り下げましたが、小さなスタックサイズではうまくいかなかった理由の答えを更新しました。楽しい! – DaoWen