[英]C code works fine when run on turbo c with windows but goes to infinite loop in gcc linux [on hold]
[英]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()調用剛剛返回一樣
這將導致新的堆棧分配,然后調用makecontext
和setcontext
。
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.