簡體   English   中英

在Mac OS小牛上運行C代碼會產生無限循環,但在Linux Ubuntu上可以正常工作

[英]Running C code on Mac OS mavericks gives infinite loop but works fine with Linux Ubuntu

下面的代碼在ubuntu gcc上可以正常工作,但是在Mac OS特立獨行者上進入無限循環。 兩者都使用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;
}

根據我對setcontext(3)的閱讀,應該是一個無限循環。 調用getcontext初始化上下文。 以下對makecontext調用將配置ctx以便在激活時調用callback setcontext的最終調用如下

成功調用setcontext()不會返回; 程序執行在傳遞給setcontext()的ucp參數指定的點處恢復。

這意味着它將調用callback callback返回

程序執行將繼續,就像相應的getcontext()調用剛剛返回一樣

這將導致新的堆棧分配,然后調用makecontextsetcontext

Apple手冊頁面更加清晰,可以解決這種情況。

setcontext()函數使先前保存的線程上下文成為當前線程上下文,即,當前上下文丟失並且setcontext()不返回。 而是在ucp指定的上下文上下文文本中繼續執行,該文本必須事先通過調用getcontext(),makecontext(3)或通過作為參數傳遞給信號處理程序進行初始化(請參見sigaction(2) ))。

如果ucp由getcontext()初始化,則執行將繼續,就像原始的getcontext()調用剛剛返回一樣。

我絕對同意@ user3386109和@JonathanLeffler的評論-使用POSIX線程。

解決方法很簡單,只需將32192替換為32 * 1024或MINSIGSTKSZ(來自signal.h),即可在兩個平台上獲得相同的輸出。 如果不小心,ucontext在Mac上的行為與Linux會有很大不同。 如果有人感興趣,我寫了一篇文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM