use*_*612 5 c signal-handling segmentation-fault
我正在研究一个涉及链表的C项目,我需要对一段代码进行分段,以证明它不起作用.但我的代码不能崩溃.
到目前为止,这是我的处理程序:
typedef void sigfunc(int);
sigfunc *signal(int, sigfunc*);
void Handler(int sig)
{
if (sig == SIGSEGV)
printf("received SegFault\n");
signal(SIGSEGV, &Handler);
}
Run Code Online (Sandbox Code Playgroud)
它需要在段错误中存活下来.到目前为止,我得到的是"收到的SegFault"的无限循环.提前致谢!
一般来说,一旦你点击了SEGFAULT,你的过程就完成了.
在专业术语中,它有可能恢复,但这样做却没有敏锐地意识到你正在做的事情是重复失败,内存泄漏,无效指针和其他问题的噩梦.
话虽这么说,除非你可以重新启动你的过程(这避免了上述所有),你可以尝试使用setjmp()和恢复longjmp().例如:
#include <setjmp.h>
jmp_buf restore_point;
void Handler(int sig)
{
if (sig == SIGSEGV)
{
printf("received SegFault\n");
signal(SIGSEGV, &Handler);
longjmp(restore_point, SIGSEGV);
}
}
void test()
{
int fault_code = setjmp(restore_point);
if (fault_code == 0)
{
// do something that might cause a segfault
}
else
{
printf("recovered from a fault; code = %d\n", fault_code);
}
}
Run Code Online (Sandbox Code Playgroud)
除了我列出的其他问题之外,另一个问题是您设置的还原点(跳转缓冲区)仅在调用范围setjmp()终止之前有效....您不能跳回到已终止的范围!
从本质上讲,它longjmp()是一个影响深远的goto,但更像是一个,gobackto因为它回到了初始化跳转缓冲区的地步.它通过setjmp()函数初始化,确保在线性setjmp()调用时返回0,并且当通过longjmp'd进入时,它将返回非零.在这种情况下,它返回longjmp()第二个参数是什么(除非该参数== 0,在这种情况下它仍然返回非零).
说真的,我已经给了你足够的信息让你变得危险,但是不要轻视我的注意事项......用这种方法解决你的问题要比解决它们容易得多,除非你非常小心和限制您使用此工具.
| 归档时间: |
|
| 查看次数: |
4129 次 |
| 最近记录: |