2013-12-18 35 views
0

我使用sigsetjmp與全局變量變化?

int n; //global var. 

int main() { 

    if (sigsetjmp(jmpenv,0)) { 
      n++; 
      printf("%d", n); 
    } 
siglongjmp(jmpenv,1); 

} 

我的問題是:該n不斷增加?意味着sigsetjmp會影響全局變量嗎?我知道它會恢復本地:)

謝謝!

+0

'setjmp()'只保存和恢復功能狀態。 'n'不在函數內部。 – 2013-12-18 22:42:35

+0

順便說一句,自己測試會比問問快! –

回答

3

siglongjmp可以以原子方式來近理解和準simultanously

  • 恢復在sigsetjmp時間
  • 註冊棧指針恢復在sigsetjmp時間
  • 註冊程序計數器恢復其他寄存器是當它們存在
  • 恢復保存的信號掩碼

您的堆棧在sigsetjmpsiglongjmp之間沒有變化(沒有動態調用函數;我們留在相同的call frame);所以,只有程序計數器(和其它寄存器)的變化,那就是像一個goto

因此您n(疊層外)可以無限期地遞增(直至溢出,可能就成爲MIN_INT

BTW,你可以看看裏面的一些免費軟件實現像MUSL-libc's siglongjmp.c,它調用的彙編代碼longjmp.s

當然,事情有很大的不同,如果n被宣佈爲本地變量(其中組合物1勒爾可能會登記)。我會想象它然後undefined behavior,但我不確定。