在Mac OS mavericks上运行C代码会产生无限循环,但在Linux Ubuntu上运行良好

时间:2014-09-13 02:19:50

标签: c macos gcc

以下代码在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;
}

2 个答案:

答案 0 :(得分:2)

从我对setcontext(3)的阅读中,它应该是一个无限循环。调用getcontext初始化上下文。以下对makecontext的调用会配置ctx,以便在激活时调用callback。最后一次致电setcontext

  

成功调用setcontext()不会返回;程序执行在传递给setcontext()的ucp参数指定的点处继续执行。

这意味着它会调用callbackcallback返回时

  

程序继续执行,就像getcontext()的相应调用刚刚返回

一样

这导致新的筹码分配,然后调用makecontextsetcontext

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