没有人知道如何在实际的信号处理程序中使用sigaltstack,简单但完整的代码可能对我有很大的帮助! 预先感谢您!如何在信号处理程序中使用“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
跳出信号处理和回哪里可避免无限递归的一个点。如果正在使用异步信号不安全的库调用,或者数据可能处于不安全/不可恢复的状态,但是如果您正在执行纯算术计算,则这可能无效。
对于信号处理程序来说,更好的任务可能是对任何尚未保存到磁盘的有价值/关键数据进行紧急转储。如果你不能调用异步信号不安全的函数,这可能很困难,但是如果你付出一些努力,通常是可能的。
这段代码不工作....它给了我一个分裂故障 – 2013-01-24 19:18:48
它适用于我(修复一个错字之后)。顺便说一下,启用优化后,gcc会为该函数生成一个无限循环而不是递归,因此不会溢出堆栈。用'-O0',信号处理程序按预期运行。 – 2013-01-25 02:38:08
我按照你所说的尝试过-O0,但它仍然给我一个分裂故障。它可以是gcc版本吗? – 2013-01-28 15:08:56
- 1. 如何使用SIGSEGV的信号处理程序调试程序
- 2. SIGKILL信号处理程序
- 3. 读信号处理程序
- 4. 线程中的信号处理程序
- 5. 如何编写sigabrt信号的信号处理程序?
- 6. C++ 11在信号处理程序中使用条件变量
- 7. 使用sigaction在Linux中的信号处理程序(C++)
- 8. 启用信号处理程序
- 9. 如何在python程序中处理操作系统信号?
- 10. 如何使用信号处理?
- 11. 在多线程信号处理程序中调用fflush?
- 12. 如何用gdb中的信号处理程序调试C程序?
- 13. Django:如何获取信号处理程序中的域名
- 14. django:模拟post_save信号处理程序?
- 15. 信号处理程序的问题
- 16. Perl 5.10.0信号处理程序问题
- 17. 信号处理程序,蟒蛇
- 18. 信号处理程序似乎工作
- 19. sem_wait和信号处理程序
- 20. 移植OS-9信号处理程序
- 21. scanf循环和信号处理程序
- 22. Perl信号处理程序和WIndows
- 23. 执行默认信号处理程序
- 24. 信号处理程序问题
- 25. 网络程序员的信号处理
- 26. Django在models.py或信号处理程序中登录用户
- 27. 如何注册子进程的信号处理程序?
- 28. 在信号处理程序中创建线程
- 29. 即使在处理程序中重置,SIGALRM的信号处理程序也不起作用
- 30. 多线程信号处理
//,这可能会使用一些格式改进。你到目前为止尝试过什么吗?它对你有用吗? – 2015-06-11 20:10:20