首页 > 代码库 > 看书小记8(《C专家编程》)
看书小记8(《C专家编程》)
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;
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。