Linux_C编程—信号处理函数的返回

本文探讨了Linux C编程中信号处理函数执行完毕后的跳转问题,主要涉及setjmp()/longjmp()和sigsetjmp()/siglongjmp()两组函数。通过示例解释了这两组函数如何实现从信号处理函数直接跳转到主函数指定位置,以及它们在处理信号阻塞方面的差异。最后,总结了在处理未决信号时的响应机制。
摘要由CSDN通过智能技术生成

信号处理函数执行完怎么办

一般来讲,信号处理函数执行完毕都会正常返回,也可以调用其他函数返回到程序的主函数中。这里总结一下信号处理函数执行完毕后跳转到主函数中指定的位置的操作(有点类似goto语句,但goto不支持函数间的跳转,只能在一个函数中跳转),主要是通过俩对函数来实现的:

  • setjmp()/longjmp()
  • sigsetjmp()/siglongjmp()

下面对俩组函数进行分析。

setjmp()/longjmp()

在信号处理函数中使用longjmp()函数可以使信号处理函数直接跳转到setjmp()函数的位置,这俩个函数的原型如下:

#include <setjmp.h>

int setjmp( jmp_buf env );
void longjmp( jmp_buf env, int val );
  • 参数env是一个全局变量,存放的是在调用longjmp()时能用来恢复栈状态的所有信息,用户无需去配置这个参数,longjmp()会自动将信息存进去
  • 参数val,在longjmp()跳转到setjmp()时,setjmp()的返回值就是val的值,所以当多个longjmp()跳转时,通过判断setjmp()的返回值就可以判断是从哪里跳转的。

下面通过一个程序来分析一下setjmp()/longjmp()的用法和不足:

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值