int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
系统跳转函数 ,可以直接在函数之间跳转 (比goto 强大多了)
将上下文 ,就是cpu和内存的信息保存到env中 ,然后调用 longjmp的时候跳转到使用env中的信息 ,恢复上下文 。如果是第一回调用setjmp 它会返回 0,如果从longjmp 跳转过来的 ,那就返回 longjmp的参数 val,根据setjmp的返回值, 我们就可以决定执行可能发生错误的代码还是直接跳过这段代码 。
发生段错误后系统会抛出 SIGSEGV 信号 ,之后 调用默认的信号处理函数 ,产生core文件 ,然后关闭程序 。
sighandler_t signal(int signum, sighandler_t handler);
第一个参数表示你要绑定的信号, 第二个参数表示信号处理的函数指针 ,返回值为void* ,参数为int
#include "stdafx.h"
#include <iostream>
#include <signal.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
#include <setjmp.h>
using namespace std;
jmp_buf env;
void recvSignal(int sig)
{
cout<<"Receive signal "<<sig<<endl;
longjmp(env, 1);
}
int _tmain(int argc, _TCHAR* argv[])
{
/*union MyUnion
{
char a[10];
int i;
}u;
int* p = (int*)&(u.a[1]);
*p = 17;*/
int r = setjmp(env);
if (r == 0)
{
signal(SIGSEGV, recvSignal);
int* p = 0;
*p = 17;
}
else
{
cout<<"Jump here"<<endl;
}
int input;
cin>>input;
return 0;
}