博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
APUE学习笔记——10.15 sigsetjmp和siglongjmp
阅读量:5165 次
发布时间:2019-06-13

本文共 1355 字,大约阅读时间需要 4 分钟。

转载自:

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

 

分类:  
 
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] 
  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://www.cnblogs.com/yxwkf/p/5177235.html

你可能感兴趣的文章
转载---JavaScript执行机制
查看>>
一头扎进 JAVA
查看>>
关于session和cookie
查看>>
【Unity3D】简要分析unity3d中剪不断理还乱的yield
查看>>
【Java】国内maven私服
查看>>
当前比较流行的前端框架2
查看>>
第三方开源水面波浪波形view:WaveView
查看>>
Django项目——web 微信开发
查看>>
iOS基础-UIKit框架-手势处理
查看>>
移动开发在路上-- IOS移动开发系列 多线程三
查看>>
CNPM
查看>>
IOS-SQLite3
查看>>
Masonry代码自动布局的简单使用。
查看>>
spring 公用异常处理
查看>>
《思帝乡·春日游》——[唐]韦庄
查看>>
poj 2391 Ombrophobic Bovines【最大流】
查看>>
有关C++新特性
查看>>
队列 二
查看>>
jQuery选择器
查看>>
uva2965
查看>>