我写了一个简单的程序,使用ucontext
库。但是,出现信号SIGSEGV(地址边界错误(。运行的环境是MacOS。我不知道我做错了什么?
此处更新:版本2
正如@Jeremy所建议的,我们可以在main_context
和work_context
上使用static。然而,如果我们将work_context
更改为数组,它仍然无法通过
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <sys/time.h>
#include <unistd.h>
#define _XOPEN_SOURCE 600
#include "ucontext.h"
static ucontext_t main_context;
static ucontext_t work_context[3]; // version 2: from ucontext_t to an array
static void counter()
{
for (int c = 0; ; c++) {
fprintf(stderr, "c = %dn", c);
sleep(5); // avoid busy loop
}
}
static ucontext_t* make_context1(ucontext_t *ucp, void (*func)())
{
getcontext(ucp);
sigemptyset(&ucp->uc_sigmask);
void *sp = malloc(SIGSTKSZ);
if (sp == NULL) {
fprintf(stderr, "malloc failedn");
exit(-1);
}
ucp->uc_stack = (stack_t) { .ss_sp = sp, .ss_size = SIGSTKSZ, .ss_flags = 0 };
ucp->uc_link = &main_context;
makecontext(ucp, func, 0);
return ucp;
}
int main() {
printf("startn");
make_context1(work_context, counter);
make_context1(work_context+1, counter); // added in version 2
make_context1(work_context+2, counter); // added in version 2
swapcontext(&main_context, work_context);
printf("main exitn");
return 0;
}
由于某些原因,如果我更改以下两行,代码运行时不会崩溃:
ucontext_t main_context;
ucontext_t work_context;
到此:
static ucontext_t main_context;
static ucontext_t work_context;
我相信对此有一个很好的解释,但我不知道它是什么:(
很简单,SIGSTKSZ
对于printf
来说太小了。增加。四倍。
将#define _XOPEN_SOURCE 600
移动到文件顶部。参见man feature_test_macros
。
为sigemptyset
添加#include <signal.h>
。将"ucontext.h"
更改为<ucontext.h>
——这是一个标准标头。