APUE学习笔记——10.15 sigsetjmp和siglongjmp
转载自:sigsetjmp使用方法
如侵犯您的权益,请联系:windeal12@qq.com
表头文件:#include <setjmp.h>
函数定义:int sigsetjmp(sigjmp_buf env, int savesigs)
函数说明:sigsetjmp()会保存眼下堆栈环境,然后将眼下的地址作一个记号,
而在程序其它地方调用siglongjmp()时便会直接跳到这个记号位置,然后还原堆栈,继续程序的运行。
參数env为用来保存眼下堆栈环境。一般声明为全局变量
參数savesigs若为非0则代表搁置的信号集合也会一块保存
当sigsetjmp()返回0时代表已经做好记号上,若返回非0则代表由siglongjmp()跳转回来。
返回:若直接调用则为0,若从siglongjmp调用返回则为非0
实例:
- #include <stdio.h>
- #include <signal.h>
- #include <setjmp.h>
- #include <unistd.h>
- #include <sys/time.h>
- sigjmp_buf jmp_env;
- static void connect_alarm(int)
- {
- siglongjmp(jmp_env, 1);
- }
- int main()
- {
- // 当超时时间sec_timeout大于等于执行时间run_time时会跳过printf("running...\n");
- int sec_timeout = 3;
- int run_time = 2;
- printf("timeout = %d, run time = %d\n", sec_timeout, run_time);
- if (sec_timeout)
- {
- // 超过用alarm函数设置的时间时产生此信号。调用connect_alarm函数
- signal(SIGALRM, connect_alarm);
- alarm(sec_timeout);
- printf("set timeout\n");
- if (sigsetjmp(jmp_env, 1))
- {
- printf("timeout\n");
- goto out;
- }
- }
- sleep(run_time);
- printf("running...\n");
- out:
- if (sec_timeout)
- {
- // 取消先前设置的闹钟
- alarm(0);
- printf("cancel timeout\n");
- }
- return 0;
- }
程序执行:
当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的更多相关文章
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
- APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号
如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_ ...
- APUE学习笔记——10信号——信号接口函数 signal 和 sigaction
signal函数 signal函数是早起Unix系统的信号接口,早期系统中提供不可靠的信号机制.在后来的分支中,部分系统使用原来的不可靠机制定义signal函数,如 Solaris 10 .而 ...
- APUE学习笔记——10 信号
信号的基本概念 信号是软件中断,信号提供了解决异步时间的方法. 每一中信号都有一个名字,信号名以SIG开头. 产生信号的几种方式 很多条件可以产生信号: 终端交互:用户 ...
- APUE学习笔记——10.18 system函数 与waitpid
system函数 system函数用方便在一个进程中执行命令行(一行shell命令). 用法如下: #include <stdio.h> #include <stdlib.h> ...
- APUE学习笔记——10.可靠信号与不可靠信号
首先说明:现在大部分Unix系系统如Linux都已经实现可靠信号. 1~31信号与SIGRTMIN-SIGRTMAX之间并不是可靠信号与不可靠信号的区别,在大多数系统下他们都是可靠信号. 只不过: 1 ...
- SQL反模式学习笔记10 取整错误
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
- Python学习笔记(15)- os\os.path 操作文件
程序1 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: import os def countfile(path): dict1 = {} # 定义一个字典 all_files = ...
- Android:日常学习笔记(10)———使用LitePal操作数据库
Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...
随机推荐
- DEV GridControl 小结(持续添加)
一.属性: 1.Views OptionsBehavior=>Editable:False 列表不可编辑 OptionsSelection=>EnableAppearanceFocuse ...
- POJ 3376 Finding Palindromes(扩展kmp+trie)
题目链接:http://poj.org/problem?id=3376 题意:给你n个字符串m1.m2.m3...mn 求S = mimj(1=<i,j<=n)是回文串的数量 思路:我们考 ...
- java 写文件解析
import java.io.File; import java.io.FileOutputStream; import java.io.*; public class FileTest { publ ...
- A Byte of Python (1)安装和运行
有两种方式构建软件设计:一种是把软件做得很简单以至于明显找不到缺陷:另一种是把它做得很复杂以至于找不到明显的缺陷. ——C.A.R. Hoare 获得人生中的成功需要的专注与坚持不懈多过天才与机会. ...
- poj 2653 计算几何
#include <iostream> #include <cstring> #include <algorithm> #include <cmath> ...
- Asp.net Role manager tutorial
It is very useful in .net we can user framework provided role manager, and easily configure in Web.C ...
- (Problem 72)Counting fractions
Consider the fraction, n/d, where n and d are positive integers. If nd and HCF(n,d)=1, it is called ...
- golang并发编程
golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止go ...
- Oracle Primavera P6 R84单机版安装教程
本教程用于指导Oracle Primavera P6 R84版本的单机版安装过程.P6 R84版本于2014年9月30日发布.其功能较之前版本有较大提升.单机版的安装方式也发生了很大的变化.P6 R8 ...
- C++的二进制兼容问题(以QT为例)
二进制不兼容带来的问题(需要重新编译库文件,以前编译的失效): http://my.oschina.net/lieefu/blog/505363?fromerr=f5jn7rct 二进制不兼容的原理: ...