码迷,mamicode.com
首页 > 其他好文 > 详细

看书小记8(《C专家编程》)

时间:2014-05-22 23:52:21      阅读:425      评论:0      收藏:0      [点我收藏+]

标签:style   c   color   a   int   文件   

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;
}

看书小记8(《C专家编程》),布布扣,bubuko.com

看书小记8(《C专家编程》)

标签:style   c   color   a   int   文件   

原文地址:http://blog.csdn.net/pandawuwyj/article/details/26515315

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!