免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 929 | 回复: 0
打印 上一主题 下一主题

信号量,setjmp,longjmp(摘自c/c++论坛) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-07 21:58 |只看该作者 |倒序浏览
#include
#include
#include
#include
#include
#include
int jn=0;
jmp_buf position;
void jmp_func1()
{
printf("get the signal for %d times\n",++jn);
longjmp(position,1);
}
void jmp_func2()
{
longjmp(position,2);
}
int
main()
{
pid_t pid = getpid();
signal(SIGUSR1,jmp_func1);
signal(SIGUSR2,jmp_func2);
(24行) setjmp(position); //在我的rh9上面这个函数没有保存信号屏蔽码
sleep(1);
kill(pid,SIGUSR1);/*在kill函数返回前执行信号处理程序,在实际的信号处理程序前,
先屏蔽 SIGUSR1,然后调用jmp_func1函数.在你这个函数中,你使用了longjmp,因此代码
跳到24行,这个时候严格说来:
没有从kill正常退出,也没有进入信号处理程序的后续例程.这个信号处理程序的后续例程的
主要工作是恢复被屏蔽的信号,恢复保存的寄存器等资源,并返回到正常程序中,但用了longjmp所有这些都不做了,直接跳到24行,继续执行,然后又一次调用kill,此次发送的信号已经被屏蔽,因此kill会很快退出,同时你的程序也结束了.
}
修改方法就很简单了,一是使用sigsetjmp和siglongjmp,二是在信号处理程序中自己恢复被屏蔽的信号,我将此两种方法的代码都贴出来让你看看,这两种代码在rh9下面都测试成功了.
版本一: 使用sigsetjmp
CODE:
[Copy to clipboard]
#include
#include
#include
#include
#include
#include
int jn=0;
sigjmp_buf position;
void jmp_func1()
{
printf("get the signal for %d times\n",++jn);
siglongjmp(position,1);
}
void jmp_func2()
{
siglongjmp(position,2);
}
int
main()
{
pid_t pid = getpid();
signal(SIGUSR1,jmp_func1);
signal(SIGUSR2,jmp_func2);
sigsetjmp(position,1);
sleep(1);
kill(pid,SIGUSR1);
}
版本二:自己恢复被屏蔽的信号
CODE:
[Copy to clipboard]
#include
#include
#include
#include
#include
#include
int jn=0;
jmp_buf position;
sigset_t mask;
void jmp_func1()
{
printf("aget the signal for %d times\n",++jn);
sigprocmask(SIG_UNBLOCK,&mask,NULL);
longjmp(position,1);
}
void jmp_func2()
{
sigprocmask(SIG_UNBLOCK,&mask,NULL);
longjmp(position,2);
}
int
main()
{
pid_t pid = getpid();
signal(SIGUSR1,jmp_func1);
signal(SIGUSR2,jmp_func2);
sigemptyset(&mask);
sigaddset(&mask,SIGUSR1);
setjmp(position);
sleep(1);
kill(pid,SIGUSR1);
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/35505/showart_272874.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP