gpt4 book ai didi

c - 具有全局变量更改的 sigsetjmp?

转载 作者:太空宇宙 更新时间:2023-11-04 07:22:17 24 4
gpt4 key购买 nike

我正在使用

int n; //global var.

int main() {

if (sigsetjmp(jmpenv,0)) {
n++;
printf("%d", n);
}
siglongjmp(jmpenv,1);

}

我的问题是:这个 n 会继续增加吗?意味着 sigsetjmp 会对全局变量产生影响吗?我知道它会恢复本地的:)

谢谢!

最佳答案

siglongjmp几乎可以理解为原子地和准同时地

  • 恢复在 sigsetjmp 注册的堆栈指针时间
  • 恢复在 sigsetjmp 注册的程序计数器时间
  • 恢复其他寄存器(如果存在)
  • 恢复保存的信号掩码

你的堆栈在 sigsetjmpsiglongjmp 之间没有变化(没有动态调用函数;我们保持相同的 call frame );所以只有程序计数器(和其他寄存器)发生变化,就像 goto

因此你的n(栈外)无限递增(直到它溢出,然后可能变成MIN_INT)

顺便说一句,您可以查看一些免费软件实现,例如 MUSL-libc's siglongjmp.c , 它调用汇编代码 longjmp.s

当然,如果 n 被声明为 local 变量(编译器可能将其放入寄存器),情况就会大不相同。我想那是undefined behavior ,但我不确定。

关于c - 具有全局变量更改的 sigsetjmp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20669856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com