C 带全局变量更改的sigsetjmp?
我正在使用C 带全局变量更改的sigsetjmp?,c,unix,C,Unix,我正在使用 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会对全局变量产生影响吗?我知道它会恢复本地的:)
谢谢 几乎可以理解为原子的和准同时的
- 正在还原在时注册的堆栈指针
- 正在还原在时注册的程序计数器
- 还原其他寄存器(如果存在)
- 恢复保存的信号掩码
sigsetjmp
和siglongjmp
之间没有变化(没有动态调用函数;我们保持不变);因此,只有程序计数器(和其他寄存器)发生变化,这就像一个goto
因此,您的n
(在堆栈之外)将无限增加(直到溢出,然后可能变成MIN\u INT
)
顺便说一句,你可以看看一些自由软件的实现,比如,它调用汇编代码
当然,如果n
被声明为局部变量(编译器可能会将其放入寄存器),情况就大不相同了。我想是的,但我不确定。几乎可以理解为原子和准同时
- 正在还原在时注册的堆栈指针
- 正在还原在时注册的程序计数器
- 还原其他寄存器(如果存在)
- 恢复保存的信号掩码
sigsetjmp
和siglongjmp
之间没有变化(没有动态调用函数;我们保持不变);因此,只有程序计数器(和其他寄存器)发生变化,这就像一个goto
因此,您的n
(在堆栈之外)将无限增加(直到溢出,然后可能变成MIN\u INT
)
顺便说一句,你可以看看一些自由软件的实现,比如,它调用汇编代码
当然,如果n
被声明为局部变量(编译器可能会将其放入寄存器),情况就大不相同了。我想是的,但我不确定。几乎可以理解为原子和准同时
- 正在还原在时注册的堆栈指针
- 正在还原在时注册的程序计数器
- 还原其他寄存器(如果存在)
- 恢复保存的信号掩码
sigsetjmp
和siglongjmp
之间没有变化(没有动态调用函数;我们保持不变);因此,只有程序计数器(和其他寄存器)发生变化,这就像一个goto
因此,您的n
(在堆栈之外)将无限增加(直到溢出,然后可能变成MIN\u INT
)
顺便说一句,你可以看看一些自由软件的实现,比如,它调用汇编代码
当然,如果n
被声明为局部变量(编译器可能会将其放入寄存器),情况就大不相同了。我想是的,但我不确定。几乎可以理解为原子和准同时
- 正在还原在时注册的堆栈指针
- 正在还原在时注册的程序计数器
- 还原其他寄存器(如果存在)
- 恢复保存的信号掩码
sigsetjmp
和siglongjmp
之间没有变化(没有动态调用函数;我们保持不变);因此,只有程序计数器(和其他寄存器)发生变化,这就像一个goto
因此,您的n
(在堆栈之外)将无限增加(直到溢出,然后可能变成MIN\u INT
)
顺便说一句,你可以看看一些自由软件的实现,比如,它调用汇编代码
当然,如果
n
被声明为局部变量(编译器可能会将其放入寄存器),情况就大不相同了。我想是这样,但我不确定。setjmp()
只保存和恢复函数状态<代码>n不在函数内。顺便说一句,自己测试要比询问更快setjmp()
仅保存和恢复函数状态<代码>n不在函数内。顺便说一句,自己测试要比询问更快setjmp()
仅保存和恢复函数状态<代码>n不在函数内。顺便说一句,自己测试要比询问更快setjmp()
仅保存和恢复函数状态<代码>n不在函数内。顺便说一句,自己测试要比询问更快!!!