看书小记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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值