如何实现非本地跳转函数setjmp与longjmp的使用?

更新于
2026-07-29 11:56:05
19阅读来源:SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1019个文字,预计阅读时间需要5分钟。

如何实现非本地跳转函数setjmp与longjmp的使用?

C语言提供了一种用户级的异常控制流形式,称为非本地跳转(nonlocal jump)。这种机制允许控制流直接从一个函数转移到另一个当前正在执行的函数,而不需要经过常规的调用和返回序列。


C语言提供了一种用户级的异常控制流形式,称为非本地跳转(nonlocal jump),它可以将控制流直接从一个函数转移到另一个当前正在执行的函数,而不需要经过正常的调用和返回序列。而这些都是通过两组函数实现的。

setjmp函数

首先来看看函数原型:

#include <setjmp.h>

int setjmp(jmp_buf env); //返回0
int sigsetjmp(sigjmp_buf env, int savesigs); //返回0
  • setjmp函数在env缓冲区中保存当前的调用环境(PC值、sp值及通用寄存器),以供后面的longjmp使用,并返回0。
  • setjmp的返回值不能用来赋值给变量,但却可以作为判断语句(switch、if)的条件。
  • sigsetjmp是设计用来被信号处理程序使用的,它的作用和setjmp类似。
阅读全文

本文共计1019个文字,预计阅读时间需要5分钟。

如何实现非本地跳转函数setjmp与longjmp的使用?

C语言提供了一种用户级的异常控制流形式,称为非本地跳转(nonlocal jump)。这种机制允许控制流直接从一个函数转移到另一个当前正在执行的函数,而不需要经过常规的调用和返回序列。


C语言提供了一种用户级的异常控制流形式,称为非本地跳转(nonlocal jump),它可以将控制流直接从一个函数转移到另一个当前正在执行的函数,而不需要经过正常的调用和返回序列。而这些都是通过两组函数实现的。

setjmp函数

首先来看看函数原型:

#include <setjmp.h>

int setjmp(jmp_buf env); //返回0
int sigsetjmp(sigjmp_buf env, int savesigs); //返回0
  • setjmp函数在env缓冲区中保存当前的调用环境(PC值、sp值及通用寄存器),以供后面的longjmp使用,并返回0。
  • setjmp的返回值不能用来赋值给变量,但却可以作为判断语句(switch、if)的条件。
  • sigsetjmp是设计用来被信号处理程序使用的,它的作用和setjmp类似。
阅读全文