gpt4 book ai didi

c - 如何在信号处理程序中使用 "sigaltstack"?

转载 作者:太空狗 更新时间:2023-10-29 16:52:16 24 4
gpt4 key购买 nike

有谁知道如何使用 sigaltstack在真正的信号处理程序中?一个简单但完整的代码可能会有很大帮助!

最佳答案

这是一个使用 sigaltstack 捕获无限递归的最小示例程序。如果您注释掉 sigaltstack 调用或 SA_ONSTACK 标志,信号处理程序将无法运行,因为它没有剩余堆栈,程序将崩溃。

#define _XOPEN_SOURCE 700
#include <signal.h>
#include <unistd.h>
void handler(int sig)
{
write(2, "stack overflow\n", 15);
_exit(1);
}
unsigned infinite_recursion(unsigned x) {
return infinite_recursion(x)+1;
}
int main()
{
static char stack[SIGSTKSZ];
stack_t ss = {
.ss_size = SIGSTKSZ,
.ss_sp = stack,
};
struct sigaction sa = {
.sa_handler = handler,
.sa_flags = SA_ONSTACK
};
sigaltstack(&ss, 0);
sigfillset(&sa.sa_mask);
sigaction(SIGSEGV, &sa, 0);
infinite_recursion(0);
}

更复杂的用法实际上可能会执行 siglongjmp 以跳出信号处理程序并返回到可以避免无限递归的点。如果正在使用异步信号不安全的库调用,或者如果您的数据可能处于不安全/不可恢复的状态,这将无效,但如果您正在执行纯算术计算,它可能是有效的。

对于信号处理程序来说,也许更好的任务是对尚未保存到磁盘的任何有值(value)/关键数据执行紧急转储。如果您不能调用 async-signal-unsafe 函数,这可能会很困难,但如果您付出一些努力,这通常是可能的。

关于c - 如何在信号处理程序中使用 "sigaltstack"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5785746/

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