컨텍스트 스위칭에 재미가 있습니다. 예제 코드를 파일에 복사했습니다. 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를 사용하여 코드를 성공적으로 실행할 수 있다는 것을 알고 있었기 때문에 예제 코드가 내 리눅스 박스에서 작동했지만 os x에서는 작동하지 않았을 때 스택 크기가 가장 큰 원인으로 보였다. – DaoWen
@Prof - 좀 더 파고 들었습니다. 왜 작은 스택 크기로 작동하지 않는지에 대한 자세한 내용으로 답변을 업데이트했습니다. 즐겨! – DaoWen