0
int n; //global var.
int main() {
if (sigsetjmp(jmpenv,0)) {
n++;
printf("%d", n);
}
siglongjmp(jmpenv,1);
}
我的问题是:该n不断增加?意味着sigsetjmp会影响全局变量吗?我知道它会恢复本地:)
谢谢!
int n; //global var.
int main() {
if (sigsetjmp(jmpenv,0)) {
n++;
printf("%d", n);
}
siglongjmp(jmpenv,1);
}
我的问题是:该n不断增加?意味着sigsetjmp会影响全局变量吗?我知道它会恢复本地:)
谢谢!
siglongjmp可以以原子方式来近理解和准simultanously
您的堆栈在sigsetjmp
和siglongjmp
之间没有变化(没有动态调用函数;我们留在相同的call frame);所以,只有程序计数器(和其它寄存器)的变化,那就是像一个goto
因此您n
(叠层外)可以无限期地递增(直至溢出,可能就成为MIN_INT
)
BTW,你可以看看里面的一些免费软件实现像MUSL-libc's siglongjmp.c
,它调用的汇编代码longjmp.s
当然,事情有很大的不同,如果n
被宣布为本地变量(其中组合物1勒尔可能会登记)。我会想象它然后undefined behavior,但我不确定。
'setjmp()'只保存和恢复功能状态。 'n'不在函数内部。 – 2013-12-18 22:42:35
顺便说一句,自己测试会比问问快! –