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
順便說一句,自己測試會比問問快! –