Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带全局变量更改的sigsetjmp?_C_Unix - Fatal编程技术网

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不在函数内。顺便说一句,自己测试要比询问更快!!!