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