免费注册 查看新帖 |

Chinaunix

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

setjmp的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-24 10:01 |只看该作者 |倒序浏览
  1. #include <signal.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <setjmp.h>
  6. #include <signal.h>
  7. int jn=0;
  8. jmp_buf position;
  9. void jmp_func1()
  10. {
  11. printf("get the signal for %d times\n",++jn);
  12. longjmp(position,1);
  13. }
  14. void jmp_func2()
  15. {
  16.         longjmp(position,2);
  17. }
  18. int
  19. main()
  20. {
  21.         pid_t pid = getpid();
  22.         signal(SIGUSR1,jmp_func1);
  23.         signal(SIGUSR2,jmp_func2);
  24.         setjmp(position);            //1
  25.         sleep(1);
  26.         kill(pid,SIGUSR1);
  27. }
复制代码

为何只print"get the signal for 1 times"进程就退出?
当收到SIGUSR1信号就执行 jmp_func1
返回到setjmp后怎么再发kill信号就没用了吗?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-08-24 10:07 |只看该作者
setjmp 是一次性的有效。longjmp 会清除 position 的。

论坛徽章:
0
3 [报告]
发表于 2006-08-24 10:18 |只看该作者
还是不明白啊,第一次kill执行了一次jmp_func1,printf一次
跳回来,再发kill应该还要printf一次才对啊

论坛徽章:
0
4 [报告]
发表于 2006-08-24 11:33 |只看该作者
而且我尝试过了,linux下longjmp 不会清除 position

论坛徽章:
0
5 [报告]
发表于 2006-08-24 12:10 |只看该作者
问题是信号怎么不可以重发起呢???

论坛徽章:
0
6 [报告]
发表于 2006-08-24 12:11 |只看该作者
问题是信号怎么不可以重发起呢???

论坛徽章:
0
7 [报告]
发表于 2006-08-24 12:52 |只看该作者
我想应该是这样的,信号是可以重发的,只是这里程序第一次收到了SIGUSR1信号,转到信号处理,信号处理应该属于软中断,这个时候已经屏蔽的正处理的信号,再有同样的信号发来将被忽略,但是可以处理其他的信号,在信号处理函数中虽然longjump回来了但是还是处于信号处理的状态,所以kill(pid,SIGUSR1)发的被忽略,接下来信号处理函数才中断返回,主进程退出。
到底是不是这么回事,还请高手指正!

论坛徽章:
0
8 [报告]
发表于 2006-08-24 20:48 |只看该作者
原帖由 epegasus 于 2006-8-24 12:52 发表
我想应该是这样的,信号是可以重发的,只是这里程序第一次收到了SIGUSR1信号,转到信号处理,信号处理应该属于软中断,这个时候已经屏蔽的正处理的信号,再有同样的信号发来将被忽略,但是可以处理其他的信号,在 ...


epegasus  分析的不错,我也觉得原来的信号处理程序根本就不能正常退出了。如果这样成立的话,看来在信号处理程序中不能调用longjmp这样的操作了。

论坛徽章:
0
9 [报告]
发表于 2006-08-24 20:57 |只看该作者
study......

论坛徽章:
0
10 [报告]
发表于 2006-08-25 09:47 |只看该作者
原来这在《UNIX高级环境编程》中有提到
10。6节:
进程捕捉到信号并继续执行时,它先执行该信号处理程序中的指令。如果从信号处理程序返回(假如没有调用exit或longjmp),则继续执行在捕捉到 信号时进程正在执行的正常指令序列。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP