关于处理SIGSEGV信号的问题
时间:2007-03-06 来源:loughsky
当内存访问非法,触发SIGSEGV信号,这时系统缺省动作是退出
一般的自定义处理也是退出,但是如果希望捕获处理后程序能继续运行,则中断返回点仍旧在非法访问处,如此则进入一个 “非法访问--信号--处理--非法访问”的死循环中,请问,如何能够避免处理返回后不在触发信号而按照自己希望的流程走下去? 使用setjmp, longjmp函数可以。
例子:
#include <setjmp.h>
static void sig_segv(int signo);
static jmp_buf jmpbuffer;
int
main(void)
{
if( setjmp(jmpbuffer) != 0 ) {
/* 如果setjmp的返回值不等于零,表明是从SIGSEV的中断处理函数返回 */
...
... /* 你的错误处理代码 */
}
signal(SIGSEGV, sig_segv);
...
... /* 你的代码 */
}
static void
sig_segv(int signo)
{
longjmp(jmpbuffer, 1); /* 跳转到 setjmp,且setjmp的返回值!=0 */
}
具体可以看《unix 环境高级编程》的第7章第10节,总的来说,上面的两个函数是程序的非局部跳转。
一般的自定义处理也是退出,但是如果希望捕获处理后程序能继续运行,则中断返回点仍旧在非法访问处,如此则进入一个 “非法访问--信号--处理--非法访问”的死循环中,请问,如何能够避免处理返回后不在触发信号而按照自己希望的流程走下去? 使用setjmp, longjmp函数可以。
例子:
#include <setjmp.h>
static void sig_segv(int signo);
static jmp_buf jmpbuffer;
int
main(void)
{
if( setjmp(jmpbuffer) != 0 ) {
/* 如果setjmp的返回值不等于零,表明是从SIGSEV的中断处理函数返回 */
...
... /* 你的错误处理代码 */
}
signal(SIGSEGV, sig_segv);
...
... /* 你的代码 */
}
static void
sig_segv(int signo)
{
longjmp(jmpbuffer, 1); /* 跳转到 setjmp,且setjmp的返回值!=0 */
}
具体可以看《unix 环境高级编程》的第7章第10节,总的来说,上面的两个函数是程序的非局部跳转。
相关阅读 更多 +
排行榜 更多 +