以下代码在ubuntu gcc上运行正常但在mac OS mavericks上进入无限循环。在两者上使用gcc48。 它是用于OS分配因此我必须使用上下文而不能使用POSIX。 当我在MAC上运行它时,它会运行“打印”无限时间
#define _XOPEN_SOURCE 6000
#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
void callback()
{
printf("callback start\n");
}
int main(void) {
ucontext_t ctx;
getcontext(&ctx);
ctx.uc_stack.ss_sp = malloc( sizeof(char) * 8192 );
ctx.uc_stack.ss_size = 8192;
ctx.uc_link = NULL;
printf("Print\n");
makecontext(&ctx, callback, 0);
setcontext(&ctx);
return 0;
}
答案 0 :(得分:2)
从我对setcontext(3)的阅读中,它应该是一个无限循环。调用getcontext
初始化上下文。以下对makecontext
的调用会配置ctx
,以便在激活时调用callback
。最后一次致电setcontext
成功调用setcontext()不会返回;程序执行在传递给setcontext()的ucp参数指定的点处继续执行。
这意味着它会调用callback
。 callback
返回时
程序继续执行,就像getcontext()的相应调用刚刚返回
一样
这导致新的筹码分配,然后调用makecontext
和setcontext
。
Apple manual page更清晰,并解决了这个问题。
setcontext()函数生成以前保存的线程上下文 当前线程上下文,即当前上下文丢失和 setcontext()不返回。相反,在con-text上下文中继续执行 由ucp指定的文本,必须先由a初始化 调用getcontext(),makecontext(3)或作为参数传递 信号处理程序(参见sigaction(2))。
如果ucp由getcontext()初始化,则继续执行,就像执行一样 原来的getcontext()调用刚刚返回(再次)。
我绝对同意@ user3386109和@JonathanLeffler的评论 - 使用POSIX线程。
答案 1 :(得分:2)
解决方案很简单,只需用32 * 1024或MINSIGSTKSZ(来自signal.h)替换8192,然后在两个平台上获得相同的输出。如果一个人不小心,ucontext在mac上的行为与Linux有很大的不同。如果有人有兴趣,我写了一个post。