沒有人知道如何在實際的信號處理程序中使用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. 使用sigaltstack來動態改變信號處理程序運行的棧
- 2. 如何使用SIGSEGV的信號處理程序調試程序
- 3. SIGKILL信號處理程序
- 4. 讀信號處理程序
- 5. 線程中的信號處理程序
- 6. 如何編寫sigabrt信號的信號處理程序?
- 7. Perl,如何使用信號處理程序打破循環sub
- 8. 在信號處理程序中使用長數據。
- 9. C++ 11在信號處理程序中使用條件變量
- 10. 在使用timer_create的單獨pthread中的信號處理程序
- 11. 使用sigaction在Linux中的信號處理程序(C++)
- 12. 啓用信號處理程序
- 13. pthread_exit()在信號處理程序
- 14. 如何在Vala中編寫button_press_event信號處理程序?
- 15. 如何在python程序中處理操作系統信號?
- 16. 如何在Python中添加處理程序和信號?
- 17. 在信號處理程序中,如何知道程序在哪裏中斷?
- 18. 如何使用信號處理?
- 19. 信號處理程序vs事件處理程序
- 20. 在多線程信號處理程序中調用fflush?
- 21. C++應用程序中的多個信號處理程序
- 22. 使用gdb處理信號
- 23. 如何用gdb中的信號處理程序調試C程序?
- 24. Django:如何獲取信號處理程序中的域名
- 25. 如何在SIGABRT信號處理程序內部等待
- 26. 如何處理SIGABRT信號?
- 27. python如何處理信號?
- 28. 使用信號處理程序暫停/恢復子進程
- 29. 執行默認信號處理程序
- 30. Perl 5.10.0信號處理程序問題
//,這可能會使用一些格式改進。你到目前爲止嘗試過什麼嗎?它對你有用嗎? – 2015-06-11 20:10:20