看书小记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;

}

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

时间: 2024-10-08 11:13:05

看书小记8(《C专家编程》)的相关文章

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

typedef不常见但值得一提的用途: 1. 用typedef来定义与平台无关的类型. 比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为: typedef long double REAL; 在不支持 long double 的平台二上,改为: typedef double REAL; 在连 double 都不支持的平台三上,改为: typedef float REAL; 也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改. 标准库就

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

函数指针 1. 函数与函数指针类型要匹配: 2. 函数指针用来保存函数首地址,即可以通过该指针访问函数: 3. 函数指针可以指向一类函数,而不是一个函数,即可以重新赋值. int maxNumber(int a, int b) { return a > b? a: b; } void fileFunc(){ cout<<"fileFunc"<<endl; } void editFunc(){ cout<<"editFunc"

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

哈希表简单实现,练个手 #include "stdafx.h" #include <iostream> using namespace std; #define HASHSIZE 12 typedef struct HashTable { int *elem; int count; }HashTable; int m = 0; void Print(HashTable* h) { for (int i = 0; i < h->count; i++) { cout

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

Cache是位于CPU寄存器与内存之间的存储器,它的容量比内存小但交换速度快. Cache的工作原理 1.读取顺序 当数据从内存读入时,整行的数据(16~32字节)被装入Cache,如果程序具有良好的地址引用局部性(顺序浏览一个字符串),那么CPU以后对邻近数据的引用就可以从快速的Cache读取,而不用从缓慢的内存读取.典型情况下,主存的存取速度可能只有Cache的四分之一. CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理:如果没有找到,就用相对慢的速度从内存

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

日期与时间 struct tm { int tm_sec;     /* 秒 – 取值区间为[0,59] */ int tm_min;     /* 分 - 取值区间为[0,59] */ int tm_hour;    /* 时 - 取值区间为[0,23] */ int tm_mday;    /* 一个月中的日期 - 取值区间为[1,31] */ int tm_mon;     /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ int tm_year;    /* 年份,

易学设计模式看书笔记(2) - 简单工厂模式

本文摘自易学设计模式一书 一.简单工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public class D

程序员学习能力提升三要素(工作用什么,就练什么,不要在上班时间看书)

IT技术的发展日新月异,新技术层出不穷,具有良好的学习能力,能及时获取新知识.随时补充和丰富自己,已成为程序员职业发展的核心竞争力.本文中,作者结合多年的学习经验总结出了提高程序员学习能力的三个要点. 众所周知,现在是一个知识爆炸的时代,知识更新非常快.据测算,一个大学毕业生所学到的知识,在毕业之后2年内,有效的不过剩下5%.对于软件行业而言,这种形势更为明显,我们赖以立足的,不在于我们现在掌握了多少知识,而是我们有多强的学习能力. 学习人人都会,但不同的人学习效果却千差万别.一个善于学习的人,

C专家编程 Expert C Programming

该书中一些思想还是比较有用的,但随着编译器以及规范的变化,书中有些内容已经发生了变化,以下是实践之后的一些总结. 1 - typedef int x[10] 和 define x int[10]  区别 define 定义为变量替换,而typedef为声明替换; #define peach int; unsigned peach i;  //wrong typedef int banana; unsigned banana i; //wrong 声明替换用typedef 识别数组和函数指针 e.

2015-10-09 Fri 晴 加快进度看书

最近老感觉每天不够用,每天7点起来,吃饭完了8点开始看书,不知道是我看书太慢了还是时间过得真的很快,不知不觉中午就到了.而这个时候我才看2章的内容,下午能多看3章内容.一本书也就一天的时候,而我现在还有3本最基本的书要看,还有一些工作还没有做,时间真的太快了.可能是因为我太没有计划没有目的的,有时候没有看完就留到明天看.受不了我自己.现在每天早上起来规定好计划.一定要完成才能睡觉. 今天下午工作计划:<ol> <li> 将接下来的c标准库看完,其中有标准IO库函数,数值字符串转换函