C异常处理机制:setjmp和longjmp

原创 2011年09月01日 16:53:52

setjmp()和longjum()是通过操纵过程活动记录实现的。它是C语言所独有的。它们部分你不了C语言有限的转移能力。这个两个函数协同工作,如下所示:
    *setjmp(jmp_buf j)必须首先被调用。它表示“使用变量j记录现在的位置。函数返回零。”
    *longjmp(jmp_buf j,int i)可以接着被调用。它表示“回到j所记录的位置,让它看上去像是从原来的setjmp()函数返回一样。但是函数返回i,使代码知道它实际上是通过longjmp()返回的。“坳口不?
    *当使用longjmp()时,j的内容被销毁。
    setjmp保存了一份程序的计数器和当前的栈顶指针。如果喜欢也可以保存一些初始值。longjmp恢复这些值,有效的转移控制并把状态重置回保存状态的时候。这被称做“展开堆栈(unwinding stack)",因为你从堆栈中展开过程活动记录,直到取得保存在其中的值。尽管longjmp会导致转移,但它和goto又有不同,区别如下:
    *goto语句不能跳出C语言当前的函数(这也是“longjmp”取名的由来,它可以跳的很远,甚至可以跳到其他文件的函数中)。
    *用longjmp只能跳回到曾经到过的地方。在setjmp的地方仍留有一个过程活动记录。从这个角度讲,longjmp更像是“从何处阿里(come from)“而不是”往哪里去(go to)”。longjmp接受一个额外的整型参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上条语句执行后自然而然来的这里的。
    下面的代码显示了setjmp()和longjmp()一例。
     #include <stdio.h>
     #include <setjmp.h>
     jmp_buf buf;
 
     banana() {
         printf("%s","in banana() \n");
         longjmp(buf,1);
         printf("%s","you will never see this \n");
     }
 
     int main() {
         if(setjmp(buf)) {
             printf("%s","back in main\n");
         }
         else {
             printf("%s","first time throught\n");
             banana();
         }
     }
    输出结果如下:
    first time throught
    in banana()
    back in main
    需要注意的地方是:保证局部变量在longjmp过程中一直保持它的值的唯一可靠方法是把它声明为volatile(这使用于那些值在setjmp执行和longjmp返回之间会改变的变量)
    setjmp/longjmp最大的用途是错误恢复。只要还没有从函数中返回,一旦发现一个不可恢复的错误,可以把控制转移到主输入循环,并从那里重新开始。有些人使用setjmp/longjmp从一串无数的函数调用中立即返回。还有些人用它们防范潜在的危险代码。
    setjmp/longjmp在C++中演变为更普通的异常处理机制"catch"和"throw"。

相关文章推荐

详解C的异常处理机制(goto\setjmp longjmp)

来自希赛网,作者王胜祥。 1 C语言中的异常处理机制     在这之前的所有文章中,都是阐述关于C++的异常处理机制。的确,在C++语言中,它提供的异常处理的模型是非常完善的,主人公阿愚因此才和“...

C异常处理机制:setjmp和longjmp

setjmp.h is a header defined in the C standard library to provide "non-local jumps": control flow th...

C语言中一种更优雅的异常处理机制 - setjmp/longjmp

转自:http://blog.chinaunix.net/u/22711/showart_445098.html 实际上goto语句是面向过程与面向结构化程序语言中,进行异常处理编程的最原始的支...

C语言 控制转移 异常处理机制 setjmp & longjmp

C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转(通常情况下,很多人都建议不要使用goto语句,因为采用goto语句后,代码维护工作量加大)。另外,C语言标准中还提供一种非局部跳转“n...

C语言异常处理机制, setjmp() and longjmp()

1、什么是异常    异常一般指的是程序运行期(Run-Time)发生的非正常情况。    异常一般是不可预测的,如:内存不足、打开文件失败、范围溢出等。    UNIX 使用信号给出异常,并当...
  • vincew
  • vincew
  • 2011年10月29日 12:48
  • 479

全面了解setjmp与longjmp(C语言异常处理机制)

C语言 - setjmp与longjmp 全面了解setjmp与longjmp(C语言异常处理机制) http://home.lupaworld.com/index.php/home/home...
  • ilvu999
  • ilvu999
  • 2012年09月05日 13:21
  • 951

C语言中利用setjmp和longjmp做异常处理

错误处理是任何语言都需要解决的问题,只有不能保证100%的正确运行,就需要有处理错误的机制。异常处理就是其中的一种错误处理方式。 1 过程活动记录(Active Record) C语言中每...

C语言利用setjmp和longjmp实现异常处理

C语言相比C++和Java没有提供异常处理机制,比如 try / catch 机制,但是我们可以使用C语言中的 setjmp / longjmp 方法来模拟出一种类似的异常处理机制。 这两个函数定义在...

浅析C_异常处理机制

  • 2012年07月04日 16:59
  • 62KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C异常处理机制:setjmp和longjmp
举报原因:
原因补充:

(最多只允许输入30个字)