如何在信号处理程序中使用“sigaltstack”?

有谁知道如何在真正的信号处理程序中使用sigaltstack ,一个简单但完整的代码可能对我很有帮助! 先感谢您!

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

 #define _XOPEN_SOURCE 700 #include  #include  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跳出信号处理程序并返回到可以避免无限递归的点。 如果正在使用异步信号不安全的库调用,或者您的数据可能处于不安全/不可恢复的状态,则无效,但如果您执行纯算术计算,则它可能有效。

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