APUE学习笔记——10.15 sigsetjmp和siglongjmp

转载自:sigsetjmp使用方法

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

分类: c/c++ linux2012-02-03
12:33 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

实例:

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

程序执行:

当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



上一篇:数据读取器对象SqlDataReader与数据适配器对象SqlDataAdapter的使用


下一篇:根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期