C 标准库 - <setjmp.h>学习笔记

一、概述

<setjmp.h> 是C标准库中的一个头文件,定义了setjmp/longjmp函数,用于实现跳转到程序上部的代码执行。

二、setjmp函数

1. 函数原型

cCopy Code
#include <setjmp.h> int setjmp(jmp_buf env);

2. 函数说明

setjmp函数是一个保存当前程序运行状态的函数,它将当前程序执行的信息保存到 jmp_buf 结构体中,并返回0。如果 setjmp函数是从 longjmp函数中跳出来的,它将返回非零值。

3. 使用方法

cCopy Code
#include <stdio.h> #include <setjmp.h> jmp_buf buf; void myfunction() { longjmp(buf, 1); } void main() { if (setjmp(buf) != 0) { printf("Jumped to myfunction\n"); return; } else{ printf("Initial call\n"); } myfunction(); }

在上述示例代码中,我们创建了一个跳转点 buf,并在 myfunction 函数中调用了 longjmp 函数来进行跳转。在 main 函数中,我们首先通过 setjmp(buf) 来记录当前程序的执行状态,并判断是否从 longjmp 函数中跳转。

4. 实例

我们可以使用 setjmp 函数来实现异常处理,以下是一个简单的例如:

cCopy Code
#include <stdio.h> #include <setjmp.h> jmp_buf env; void divide(int a, int b) { if (b == 0) { longjmp(env, 1); } else{ printf("%d/%d=%d\n", a, b, a/b); } } int main() { int a = 10, b = 0; if (setjmp(env) != 0) { printf("Divide By Zero Exception Caught\n"); return -1; } divide(a, b); return 0; }

在上述示例中,我们在 divide 函数中使用了 longjmp 函数来实现异常处理。当除数为0时,我们调用 longjmp 函数跳转到 setjmp 函数处进行异常处理。

三、longjmp函数

1. 函数原型

cCopy Code
#include <setjmp.h> void longjmp(jmp_buf env, int val);

2. 函数说明

longjmp函数用于跳转到由 setjmp 函数保存的程序执行位置,并将保存的值传递给 setjmp 函数。

3. 使用方法

cCopy Code
#include <stdio.h> #include <setjmp.h> jmp_buf buf; void myfunction() { longjmp(buf, 1); } void main() { if (setjmp(buf) != 0) { printf("Jumped to myfunction\n"); return; } else{ printf("Initial call\n"); } myfunction(); }

在上述示例代码中,我们创建了一个跳转点 buf,并在 myfunction 函数中调用了 longjmp 函数来进行跳转。在 main 函数中,我们首先通过 setjmp(buf) 来记录当前程序的执行状态,并判断是否从 longjmp 函数中跳转。

4. 实例

以下示例演示了如何使用 longjmp 函数实现异常处理:

cCopy Code
#include <stdio.h> #include <setjmp.h> jmp_buf env; void divide(int a, int b) { if (b == 0) { longjmp(env, 1); } else{ printf("%d/%d=%d\n", a, b, a/b); } } int main() { int a = 10, b = 0; if (setjmp(env) != 0) { printf("Divide By Zero Exception Caught\n"); return -1; } divide(a, b); return 0; }

在上述示例中,我们在 divide 函数中使用了 longjmp 函数来实现异常处理。当除数为0时,我们调用 longjmp 函数跳转到 setjmp 函数处进行异常处理。

四、总结

<setjmp.h> 头文件中的 setjmplongjmp 一般用于进程的异常处理,如:进程错误退出、进程死锁等场景。在使用 setjmplongjmp 函数时要非常小心,因为不正确的使用会导致程序出现异常行为,建议在使用时仔细阅读函数的使用说明。