函数 setjmp, longjmp, sigsetjmp, siglongjmp
一,相关函数接口
1,setjmp,longjmp,sigsetjmp,siglongjmp
#include <setjmp.h>
int setjmp(jmp_buf env);
int sigsetjmp(sigjmp_buf env, int savesigs); //savesigs非0时,在env中保存进程当前信号屏蔽字。
void longjmp(jmp_buf env, int val);
void siglongjmp(sigjmp_buf env, int val);  //savesigs非0时,该函数会从env中恢复保存的信号屏蔽字。
2,sigprocmask
#include<setjmp.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 返回 0/-1;
获取当前信号屏蔽字:how任意值,set==NULL,当前信号屏蔽字保存在*oldset中
修改当前信号屏蔽字:*set != NULL,how: SIG_BLOCK,并集;SIG_UNBLOCK,交集;SIG_SETMASK,新值。
3,信号集管理
#include <signal.h>
int sigemptyset(sigset_t *set);清空
int sigfillset(sigset_t *set);全集
int sigaddset(sigset_t *set, int signum);添加
int sigdelset(sigset_t *set, int signum);删除
int sigismember(const sigset_t *set, int signum);测试信号是否在集合中
4,查询挂起信号集
#include <signal.h>
int sigpending(sigset_t *set); 返回 0/-1,*set保存挂起信号集
5,设置定时器
#include <unistd.h>
unsigned int alarm(unsigned int seconds); 返回 0 或者以前设置的闹钟时间的剩余秒数
seconds定时器时间秒数
int pause(void); 挂起调用进程直到捕捉到一个信号。
6,发送信号
#include<signal.h>
int raise(int signo) 给进程自身发送信号。
int kill(pid_t pid,int signo) 发送信号给进程或组
pid>0,发送信号给进程ID为pid的进程
pid==0,发送进程给本组所有进程(不包括系统进程集)
pid==-1,有权发送信号的所有进程(不包括系统进程集)
pid<0,有权发送信号的所有进程(不包括系统进程集)和进程ID为-pid的进程
1,setjmp,longjmp一般应用
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
jmp_buf jmp;
void fun1()
{
printf("fun1 done\n");
longjmp(jmp,1); //直接返回,后面不再执行
printf("fun1 continue\n");
}
void fun2()
{
printf("fun2 done\n");
longjmp(jmp,2); //直接返回,后面不再执行
printf("fun2 continue\n");
}
int main()
{
switch(setjmp(jmp)){
case 1:
printf("main case 1\n");
return;
case 2:
printf("main case 2\n");
fun1();
return;
default:
printf("default\n");
break;
}
fun2();
}
default
fun2 done
main case 2
fun1 done
main case 1
2,信号处理中的应用,longjmp返回时,会把信号加入信号屏蔽字中
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
#include<unistd.h>
#include<signal.h>
typedef void (*sigfun)(int);
jmp_buf jmp; void sig_alrm(int signo)
{
printf("sig alrm\n");
longjmp(jmp,1);
}
inline void err_sys(char *str)
{
printf("%s\n",str);
exit(-1);
} int main()
{
sigset_t oset;
sigprocmask(0,NULL,&oset);
if(sigismember(&oset,SIGALRM)) printf("SIGALRM in oset\n");
sigfun prefun=signal(SIGALRM,sig_alrm);
if(prefun==SIG_ERR) err_sys("signal(SIGALRM) error");
if(setjmp(jmp)!=0){
sigprocmask(0,NULL,&oset);
if(sigismember(&oset,SIGALRM)) printf("SIGALRM in oset\n");
err_sys("timeout");
}
int a=alarm(3);
printf("%d\n",a);
sleep(4);
alarm(0);
signal(SIGALRM,prefun);
return 0;
}
0
sig alrm
SIGALRM in oset   说明处理的信号已经自动加入了信号屏蔽字中
timeout
2,信号处理中,使用sigsetjmp, siglongjmp可以避免“自动加入“
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
#include<unistd.h>
#include<signal.h>
typedef void (*sigfun)(int);
sigjmp_buf jmp; void sig_alrm(int signo)
{
printf("sig alrm\n");
siglongjmp(jmp,1);
}
inline void err_sys(char *str)
{
printf("%s\n",str);
exit(-1);
} int main()
{
sigset_t oset;
sigprocmask(0,NULL,&oset);
if(sigismember(&oset,SIGALRM)) printf("SIGALRM in oset\n");
sigfun prefun=signal(SIGALRM,sig_alrm);
if(prefun==SIG_ERR) err_sys("signal(SIGALRM) error");
if(sigsetjmp(jmp,1)!=0){
sigprocmask(0,NULL,&oset);
if(sigismember(&oset,SIGALRM)) printf("SIGALRM in oset\n");
err_sys("timeout");
}
int a=alarm(3);
printf("%d\n",a);
sleep(4);
alarm(0);
signal(SIGALRM,prefun);
return 0;
}
0
sig alrm
timeout
函数 setjmp, longjmp, sigsetjmp, siglongjmp的更多相关文章
- 信号处理函数的返回sigsetjmp/siglongjmp
		
由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sigsetjmp/s ...
 - Linux setjmp longjmp
		
/********************************************************************* * Linux setjmp longjmp * 说明: ...
 - setjmp/longjmp 使用
		
C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转(通常情况下,很多人都建议不要使用goto语句,因为采用goto语句后,代码维护工作量加大).另外,C语言标准中还提供一种非局部跳转“n ...
 - setjmp/longjmp
		
1.setjmp/longjmp属于传统的错误处理 2.setjmp/longjmp是对goto语句的补充,goto仅仅能实现局部跳转.setjmp/longjmp能够实现全局跳转 3.setjmp/ ...
 - 信号处理函数的返回setjmp/longjmp
		
信号处理函数可以正常返回,也可以调用其他函数返回到程序的主函数中,而不是从该处理程序返回. 正如ANSI C标准所说明的,一个信号处理程序可以返回或者调用abort.exit或longjmp(goto ...
 - goto语句的升级版,setjmp,longjmp
		
我们知道goto语句是不能跳过函数的,但是在我么C语言的应用中,在不使用汇编的情况下,遇到需要跳出深层循环比如检错机制的时候,有确实想要跨函数跳转,有没有上面办法可以做到呢? 这就是今天要讲的两个库函 ...
 - setjmp()/longjmp()的使用方法
		
setjmp和longjmp.为了让你实现复杂的流控制,程序在系统里面运行完全依靠内存(代码段,全局段,堆存储器,栈存储器)和寄存器的内容(栈指针,基地址,计数器),setjmp保存当前的寄存器里面的 ...
 - c setjmp longjmp
		
http://coolshell.cn/?s=setjmp http://www.cnblogs.com/hazir/p/c_setjmp_longjmp.html double divide(dou ...
 - setjmp/longjmp 处理异常
		
#include <stdio.h> #include <stdlib.h> #include <setjmp.h> jmp_buf jb; void f1() { ...
 
随机推荐
- SQLServer 2012 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。
			
楼主用SQL Server 2012 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - ...
 - 使用 hibernate 存取大对象数据类型(clob和blob)
			
数据库表如下: book表 id 该表的主键.number类型. photo 代表图书的图片,blob类型. description 图书的描述,clob类型. 使用 hibernate3 往 boo ...
 - SVN提交出现“< < < < < < < .mine’无效,路径中具有非法字符”的问题
			
使用SVN提交或更新后经常会出现”Files 的值’< < < < < < < .mine’无效.路径中具有非法字符”的错误.查阅了下资料,是因为:你更改了一 ...
 - scrollTop,offset().top
			
1.scrollTop是指滚动条滚动的距离 如果没有出现滚动条,则距离为0 css: <style type="text/css"> *{ margin: 0; pad ...
 - 14-利用SVD简化数据
			
参考:http://blog.csdn.net/geekmanong/article/details/50494936 http://www.2cto.com/kf/201503/383087.htm ...
 - SQL Server 文件流文件组
			
背景: 文件流通过在文件系统上存储blob数据文件将数据库引擎与ntfs文件集成在一起,使用t-sql和win32访问数据. 文件流使用windows系统来缓存数据,有助于在减少文件流数据对sql s ...
 - Method "setAge" failed for object action.RegistAction@1f05562b [java.lang.No....
			
大家好,如果大家看到了这篇文字.我觉得大家应该是遇到了该类问题. 首先,NullPointerException 空指针异常. 其次,大家应该是是在使用struts2和hibernate的使用遇到的这 ...
 - JavaScript学习之—prototype
			
一.利用prototype扩展String方法,去除字符前后空格: String.prototype.trim = function String$trim() { if (arguments.len ...
 - vs2008调试 Release(链接器来生成调试信息)
			
VS2008 Release 修改配置: 1.项目——>属性——>C/ C++ ——> 常规 ——>调试信息格式——>用于“编辑并继续”的程序数据库(/ZI) 2.项目— ...
 - 利用代码改变世界 #AzureDev
			
毫无疑问,开发人员是 //build/ 2013 的主角.开发人员是我们这个行业的心脏和灵魂,我们很感谢他们所做的一切.在 Satya Nadella 走上讲台发表第 2 天的主题演讲之前,我们播放了 ...