具有全局变量的sigsetjmp?

时间:2013-12-18 22:34:23

标签: c unix

我正在使用

int n; //global var.

int main() {

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

}

我的问题是:这会继续增加吗?意味着sigsetjmp会对全局变量产生影响吗?我知道它会恢复当地的:)

谢谢!

1 个答案:

答案 0 :(得分:3)

siglongjmp几乎可以被理解为原子的和准同时的

  • 恢复在sigsetjmp时间
  • 注册的堆栈指针
  • 恢复在sigsetjmp时间注册的程序计数器
  • 恢复其他寄存器(如果存在)
  • 恢复已保存的信号掩码

您的堆栈在sigsetjmpsiglongjmp之间不会发生变化(没有动态调用函数;我们保持相同的call frame);所以只有程序计数器(和其他寄存器)发生变化,就像goto

一样

因此你的n(在堆栈之外)无限增加(直到它溢出,然后可能变为MIN_INT

顺便说一句,您可以查看一些免费软件实现,例如MUSL-libc's siglongjmp.c,它会调用汇编代码longjmp.s

当然,如果将n声明为 local 变量(编译器可能放入寄存器中),情况就会大不相同。我想它会是undefined behavior,但我不确定。