陳鍾誠

Version 1.0

長程跳躍 – (setjump 與 longjump)

在錯誤發生時,儲存行程狀態,執行特定程式的方法

程式範例: setjump 與 longjump

    #include <stdio.h>
    #include <setjmp.h>

    jmp_buf jumper;

    int div(int a, int b) {
      if (b == 0) { // can't divide by 0
        longjmp(jumper, -3);
      }
      return a / b;
    }

    int main(int argc, char *argv[]) {
      int jstatus = setjmp(jumper);
      if (jstatus == 0) {
        int a = atoi(argv[1]);
        int b = atoi(argv[2]);
        printf("%d/%d", a, b);
        int result = div(a, b);
        printf("=%d\n", result);
      } 
      else if (jstatus == -3)
        printf(" --> Error:divide by zero\n");
      else
        printf("Unhandled Error Case");
    }

執行結果

    D:\cp>gcc jump.c -o jump

    D:\cp>jump 7 2
    7/2=3

    D:\cp>jump 7 0
    7/0 --> Error:divide by zero

來自 jserv 的建議

    => 請提及 C 語言作例外處理的重要性,以及如何用 setjump/longjump 實做 user-level thread 和 coroutine

    可參見拙作: http://blog.linux.org.tw/~jserv/archives/001848.html

參考文獻

  • Java2s (C / ANSI-C) » setjmp.h » longjmp, http://www.java2s.com/Code/C/setjmp.h/longjmplongjump.htm
  • Exception Handling in C without C++ – Clean error handling without overhead, by Tom Schotland and Peter Petersen http://www.on-time.com/ddj0011.htm
  • 第16集 C语言中一种更优雅的异常处理机制, 作者:王胜祥 来源:希赛网 http://www.csai.cn 2005年5月19日
  • 第17集 全面了解setjmp与longjmp的使用, 作者:王胜祥 来源:希赛网 http://www.csai.cn 2005年5月21日