转载自: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



APUE学习笔记——10.15 sigsetjmp和siglongjmp的更多相关文章

  1. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  2. APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号

    如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_ ...

  3. APUE学习笔记——10信号——信号接口函数 signal 和 sigaction

    signal函数     signal函数是早起Unix系统的信号接口,早期系统中提供不可靠的信号机制.在后来的分支中,部分系统使用原来的不可靠机制定义signal函数,如 Solaris 10 .而 ...

  4. APUE学习笔记——10 信号

    信号的基本概念     信号是软件中断,信号提供了解决异步时间的方法.     每一中信号都有一个名字,信号名以SIG开头. 产生信号的几种方式     很多条件可以产生信号:     终端交互:用户 ...

  5. APUE学习笔记——10.18 system函数 与waitpid

    system函数 system函数用方便在一个进程中执行命令行(一行shell命令). 用法如下: #include <stdio.h> #include <stdlib.h> ...

  6. APUE学习笔记——10.可靠信号与不可靠信号

    首先说明:现在大部分Unix系系统如Linux都已经实现可靠信号. 1~31信号与SIGRTMIN-SIGRTMAX之间并不是可靠信号与不可靠信号的区别,在大多数系统下他们都是可靠信号. 只不过: 1 ...

  7. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  8. Python学习笔记(15)- os\os.path 操作文件

    程序1 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: import os def countfile(path): dict1 = {} # 定义一个字典 all_files = ...

  9. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

随机推荐

  1. 数组length属性的一些特性

    ~~·数组的length属性是可读写的 var colors = ["blue","red","green"];colors.length ...

  2. 射频识别技术漫谈(18)——Mifare Desfire

    Mifare  DESFire(MF3 IC D40/D41,本文以D40为例)遵守14443 TypeA协议,卡内的数据以文件形式存储,所以有人认为它是准CPU卡,主要用于安全性要求较高的非接触式领 ...

  3. QString类的使用(无所不包,极其方便)

    Qt的QString类提供了很方便的对字符串操作的接口. 使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替. QString::fill ( QChar ch, int size ...

  4. [Windows编程] 开发DLL必读《Best Practices for Creating DLLs》

    开发DLL的时候,需要十分注意 DllMain 函数,因为在多线程环境下DLLMain里面的代码很容易引发线程死锁. 这篇MSDN文章<Best Practices for Creating D ...

  5. HDU 1108 最小公倍数

    #include <cstdio> int gcd(int a,int b) { ) return a; else return gcd(b,a%b); } int main() { in ...

  6. File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别

    1 ) File 类介绍 File 类封装了对用户机器的文件系统进行操作的功能.例如,可以用 File 类获得文件上次修改的时间移动, 或者对文件进行删除.重命名.换句话说,流类关注的是文件内容,而 ...

  7. 用javap命令反编译来分析字符串问题

    编写Test.java.编译完后生成Test.class文件,然后对该文件运行javap -c Test命令,生成字节码指令.阅读并得出结论 一.s1和s2指向常量池的不同常量 ①java代码 pub ...

  8. Linux 内核的编译系统

    Linux  的编译使用 GNU make 工具来检查整个系统的文件和调用 gcc 工具以及脚本完毕编译源码生成 image 等操作.要了解整个编译系统,我们首先要了解 Linux 内核的 Makef ...

  9. .c和.h文件的区别(头文件与之实现文件的的关系~ )

     .c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢 ...

  10. 使用C#对MongoDB中的数据进行查询,改动等操作

    首先,使用的是官方提供的C#訪问组件https://github.com/mongodb/mongo-csharp-driver 然后.编译后引用MongoDB.Bson.dll及MongoDB.Dr ...