我正在使用
int n; //global var.
int main() {
if (sigsetjmp(jmpenv,0)) {
n++;
printf("%d", n);
}
siglongjmp(jmpenv,1);
}
我的问题是:这会继续增加吗?意味着sigsetjmp会对全局变量产生影响吗?我知道它会恢复当地的:)
谢谢!
答案 0 :(得分:3)
siglongjmp几乎可以被理解为原子的和准同时的
您的堆栈在sigsetjmp
和siglongjmp
之间不会发生变化(没有动态调用函数;我们保持相同的call frame);所以只有程序计数器(和其他寄存器)发生变化,就像goto
因此你的n
(在堆栈之外)无限增加(直到它溢出,然后可能变为MIN_INT
)
siglongjmp.c
,它会调用汇编代码longjmp.s
当然,如果将n
声明为 local 变量(编译器可能放入寄存器中),情况就会大不相同。我想它会是undefined behavior,但我不确定。