setjmp,longjmp,isgsetjmp,siglongjump
来源:互联网 发布:linux 复制文件夹 编辑:程序博客网 时间:2024/06/08 11:51
最近在学习Linux的编程,在学习到进程间通信时,学习的是基本的信号通信。学习完成之后,想写个简单的例子来复习下,没想到引起了一个问题,代码如下:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf position1;
int catch(int sig)
{
longjmp(position1,1);
}
int main()
{
int i=0;
printf("good morming\n");
sigset(SIGALRM,(__sighandler_t)catch);
setjmp(position1,1);
alarm(2);
printf("enter %d\n",i++);
while(1);
return 0;
}
在到时的中断一次跳转之后,不再中断跳转。原来使用setjmp(),longjmp()函数时,但信号中断之后,自动的将该信号加入到屏蔽信号集中,因此再次到时时,不再能捕捉到信号。而使用sigsetjmp()和siglongjmp(),如果sigsetjmp的第二个参数值不为0,则不将该信号添加至屏蔽集。问题就可以解决;
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf position1;
int catch(int sig)
{
siglongjmp(position1,1);
}
int main()
{
int i=0;
printf("good morming\n");
sigset(SIGALRM,(__sighandler_t)catch);
sigsetjmp(position1,1);
alarm(2);
printf("enter %d\n",i++);
while(1);
return 0;
}
则可以一直捕获信号。
- setjmp,longjmp,isgsetjmp,siglongjump
- setjmp longjmp
- setjmp()/longjmp()
- setjmp longjmp
- setjmp longjmp
- setjmp longjmp
- setjmp/longjmp
- setjmp/longjmp
- setjmp&longjmp
- setjmp\longjmp
- setjmp longjmp
- setjmp & longjmp
- setjmp&longjmp
- setjmp/longjmp
- setjmp longjmp
- setjmp/longjmp
- setjmp.h setjmp/longjmp
- setjmp()和longjmp()
- 一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。复杂度如果是O(n2)则不得分。
- Oracle入门:Order By 和Group By 的基本用法
- 类SVN的多平台数据同步系统服务器端设计
- Ext.Net 1.x_Ext.Net.GridPanel之右键菜单
- 数据库索引 ,sql视图的作用(2012-05-29 11:42:17)
- setjmp,longjmp,isgsetjmp,siglongjump
- WTL:如何绘制ComboBox
- [转]推荐给 JavaScript 开发者十款超级有用的工具
- linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解
- Android将允许纯C/C++开发应用
- SQL Server优化的方法<二>
- 从URL加载图像
- 位图排序
- c 常量 const