没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
setjmp 与 longjmp 使用方法和适用的场合全面介绍
int setjmp(jmp_buf jmpb) 设置缓冲区来保存堆栈的内容,将保存的上下文存入进
程的自身的数据空间(u 区),并继续在当前的上下文中执行,一旦碰到了 longjmp,进程就从
该进程 的 u 区,取出先前保存的上下文,并恢复该进程的上下文为先前保存的上下文。这时核
心将使得进程从 setjmp 处执行(摘自:unix 平台下 c 语言高级编程 指南)
void longjmp(jmp_buf jmpb, int retval) 使进程返回到 setjmp 处执行,retval 表示
此时 setjmp 的返回值。
longjmp 必须在 setjmp 调用之后,而且 longjmp 必须在 setjmp 的作用域之内。具体来
说,在一个函数中使用 setjmp 来初始化一个全局标号,然后只要该函数未曾返回,那么在其它
任何地方都可以通过 longjmp 调用来跳转到 setjmp 的下一条语句执行。实际上 setjmp 函数
将发生调用处的局部环境保存在了一个 jmp_buf 的结构当中,只要主调函数中对应的内存未曾
释放 (函数返回时局部内存就失效了),那么在调用 longjmp 的时候就可以根据已保存的
jmp_buf 参数恢复到 setjmp 的地方执行。
setjmp函数的返回值(直接返回时为 0,longjmp 跳转返回时为 longjmp 的状态参数
retval,根据 setjmp 的返回值就可以判断程序是正常执行还是进行异常处理。
另外请特别注意,setjmp 函数与 longjmp 函数总是组合起来使用,它们是紧密相关的一
对操作,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,才能按照程序员的预
先设计的意图,去实现对程序中可能出现的异常进行集中处理。
------》【与 goto 语句的作用类似,它能实现本地的跳转】《-----
void main( void )
{
int jmpret;
jmpret = setjmp( mark );
if( jmpret == 0 )
{
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(1) longjmp(mark, 1);
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(2) longjmp(mark, 2);
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(-1) longjmp(mark, -1);
// 其它代码的执行
}
else
{
// 错误处理模块
switch (jmpret)
{
资源评论
FreeB_U
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功