c-调用swapcontext()时出现地址边界错误



我写了一个简单的程序,使用ucontext库。但是,出现信号SIGSEGV(地址边界错误(。运行的环境是MacOS。我不知道我做错了什么?

此处更新:版本2

正如@Jeremy所建议的,我们可以在main_contextwork_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>——这是一个标准标头。

相关内容

  • 没有找到相关文章

最新更新