2013-12-18 38 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,但我不确定。