APUE学习笔记——10.15 sigsetjmp和siglongjmp[通俗易懂]

APUE学习笔记——10.15 sigsetjmp和siglongjmp

大家好,又见面了,我是全栈君。

转载自:sigsetjmp使用方法

侵犯您的权益,请联系:windeal12@qq.com

 

sigsetjmp使用方法

分类: c/c++ linux
 
1252人阅读 
评论(0) 
收藏 
举报
相关函数:longjmp, siglongjmp, setjmp 


表头文件:#include <setjmp.h> 


函数定义:int sigsetjmp(sigjmp_buf env, int savesigs) 


函数说明:sigsetjmp()会保存眼下堆栈环境,然后将眼下的地址作一个记号,


而在程序其它地方调用siglongjmp()时便会直接跳到这个记号位置,然后还原堆栈,继续程序的运行。 


參数env为用来保存眼下堆栈环境。一般声明为全局变量 


參数savesigs若为非0则代表搁置的信号集合也会一块保存 


当sigsetjmp()返回0时代表已经做好记号上,若返回非0则代表由siglongjmp()跳转回来。

 
返回:若直接调用则为0,若从siglongjmp调用返回则为非0

实例:

[cpp] 
view plain
copy

  1. #include <stdio.h>  
  2. #include <signal.h>  
  3. #include <setjmp.h>  
  4. #include <unistd.h>  
  5. #include <sys/time.h>  
  6.   
  7. sigjmp_buf jmp_env;  
  8.   
  9. static void connect_alarm(int)  
  10. {  
  11.     siglongjmp(jmp_env, 1);  
  12. }  
  13.   
  14. int main()  
  15. {  
  16.     // 当超时时间sec_timeout大于等于执行时间run_time时会跳过printf(“running…\n”);  
  17.     int sec_timeout = 3;  
  18.     int run_time = 2;  
  19.   
  20.     printf(“timeout = %d, run time = %d\n”, sec_timeout, run_time);  
  21.     if (sec_timeout)  
  22.     {  
  23.         // 超过用alarm函数设置的时间时产生此信号。调用connect_alarm函数  
  24.         signal(SIGALRM, connect_alarm);  
  25.         alarm(sec_timeout);  
  26.         printf(“set timeout\n”);  
  27.         if (sigsetjmp(jmp_env, 1))  
  28.         {  
  29.             printf(“timeout\n”);  
  30.             goto out;  
  31.         }  
  32.     }  
  33.   
  34.     sleep(run_time);  
  35.     printf(“running…\n”);  
  36.   
  37. out:  
  38.     if (sec_timeout)  
  39.     {  
  40.         // 取消先前设置的闹钟  
  41.         alarm(0);  
  42.         printf(“cancel timeout\n”);  
  43.     }  
  44.   
  45.     return 0;  
  46. }  


程序执行:
当ec_timeout = 3, run_time = 2时:
timeout = 3, run_time = 2
set timeout
running…
cancel timeout

当ec_timeout = 3, run_time = 4时:
timeout = 3, run_time = 4
set timeout
timeout
cancel timeout



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116077.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Map与JSONObject对象相互转换记录「建议收藏」

    Map与JSONObject对象相互转换记录「建议收藏」业务背景:因为要嵌套一些数据报表,页面点击菜单直接进行url访问,因访问受限要修改url权限,返回数据是JSONObject,防止出现异常,后台进行了一些Map于JSONObject的转换,记录下来配置得json文件格式:{“redashLinks”:[{“name”:”在盈利表”,”url”:”http://i…

    2022年10月5日
    0
  • PHP数组转换json「建议收藏」

    PHP数组转换json「建议收藏」<?php$arr=array(‘a’=>1,’b’=>2,’c’=>3,’d’=>4,’e’=>5);echojson_encode($arr);?>

    2022年6月21日
    24
  • Pycharm的python interpreter选择「建议收藏」

    Pycharm的python interpreter选择「建议收藏」初学python时我在电脑装idle,装上了ANACONDA,也裸装了python3.9(也就是说我电脑上有两个独立的python,一个是python3.9,另一个是装在Anaconda里面的python3.7。在我装上Pycharm后,Pycharm自动使用Anaconda提供的环境,虽然Anaconda的包很全,但还是有缺少的包,当我使用pip命令安装需要的包时,确自动安装到了python3.9的安装目录下,而且命令行运行python时只运行python3.9而不是Anaconda里面的python

    2022年8月27日
    3
  • MySQL-索引;视图「建议收藏」

    MySQL-索引;视图「建议收藏」一、索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。如:我们通过汉字字典查找汉字有两种方式(1)一页一页挨着找,直到找到为止,这种查找方式属于全字典扫描(2)通过汉语字典的目录页(索引),按拼音、笔画、偏旁部首等排序的目录(索引)缩小查找范围快速查找到需要的字select*fromt_userwherename=’zhangsan’;如果name字段上没有添加索引(目录),或者说没有给name字段创建索引,MySQL会

    2022年7月22日
    10
  • Linux计划任务「建议收藏」

    Linux计划任务「建议收藏」计划任务的安排方式分两种:一种是定时性的,也就是例行。就是每隔一定的周期就要重复来做这个事情一种是突发性的,就是这次做完了这个事,就没有下一次了,临时决定,只执行一次的任务at和crontab这

    2022年7月4日
    16
  • 圈真的决定你的未来?

    圈真的决定你的未来?

    2022年1月6日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号