免费注册 查看新帖 |

Chinaunix

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

[C] apue中的siguspend函数例子运行问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-06 16:08 |只看该作者 |倒序浏览
本帖最后由 星辉流动 于 2012-09-06 16:10 编辑

在看apue信号这一章时,运行程序10-16出现和书本不一样的结果,代码如下
  1. 1 #include "../include/apue.h"                                                                                                                                                                           
  2.   2 volatile sig_atomic_t quitflag;
  3.   3
  4.   4 static void
  5.   5 sig_int(int signo)
  6.   6 {
  7.   7     if(signo == SIGINT)
  8.   8     {
  9.   9         pr_mask("SIGINT: ");
  10. 10         printf("\ninterrupt\n");
  11. 11     }
  12. 12     else if(signo == SIGQUIT)
  13. 13     {
  14. 14         pr_mask("SIGQUIT: ");
  15. 15         quitflag = 1;
  16. 16         printf("SIGQUIT\n");
  17. 17     }
  18. 18     else
  19. 19     {
  20. 20         printf("%s",strsignal(signo));
  21. 21     }
  22. 22 }
  23. 23
  24. 24 int
  25. 25 main(void)
  26. 26 {
  27. 27     sigset_t newmask, oldmask, zeromask;
  28. 28
  29. 29     if(signal(SIGINT, sig_int) == SIG_ERR)
  30. 30         err_sys("signal(SIGINT) error");
  31. 31     if(signal(SIGQUIT, sig_int) == SIG_ERR)
  32. 32         err_sys("signal(SIGQUIT) error");
  33. 33
  34. 34     sigemptyset(&newmask);
  35. 35     sigemptyset(&zeromask);
  36. 36     sigaddset(&newmask,SIGQUIT);
  37. 37     
  38. 38     if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
  39. 39         err_sys("SIG_BLOCK error");
  40. 40     while(quitflag == 0)
  41. 41     {
  42. 42         pr_mask("loop: ");
  43. 43         sigsuspend(&zeromask);
  44. 44         printf("quitflag = %d\n",quitflag);
  45. 45     }
  46. 46     pr_mask("after loop: ");
  47. 47     quitflag = 0;
  48. 48
  49. 49     if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
  50. 50         err_sys("SIG_SETMASK error");
  51. 51     exit(0);
  52. 52 }                       
复制代码
编译运行如下:
  1. [root@localhost signal]# gcc -g -o sigsuspendwait sigsuspendwait.c ../include/err.c pr_mask.c
复制代码
  1. [root@localhost signal]# ./sigsuspendwait               
  2. loop: SIGQUIT
  3. SIGINT:

  4. interrupt
  5. quitflag = 0
  6. loop: SIGQUIT

  7. [root@localhost signal]#
复制代码
在运行的时候,只能接受SIGINT信号一次,再次按Ctrl+c程序就退出了,而不是书上那样可以连续按ctrl+c,这是为什么呢??

论坛徽章:
23
双鱼座
日期:2013-08-30 09:25:19辰龙
日期:2014-07-28 11:22:24白羊座
日期:2014-08-26 10:34:1815-16赛季CBA联赛之浙江
日期:2016-03-15 10:51:5415-16赛季CBA联赛之八一
日期:2016-05-31 09:38:3615-16赛季CBA联赛之辽宁
日期:2017-08-31 14:59:2115-16赛季CBA联赛之辽宁
日期:2017-12-06 14:12:3615-16赛季CBA联赛之天津
日期:2019-01-02 15:25:4915-16赛季CBA联赛之深圳
日期:2020-12-06 11:26:21狮子座
日期:2014-05-19 09:16:35技术图书徽章
日期:2014-03-27 13:37:39技术图书徽章
日期:2013-08-30 09:28:52
2 [报告]
发表于 2012-09-07 11:18 |只看该作者
理论上,多次Ctrl+C没有问题;
实际上,尝试了下,也是这样的。

楼主再试试吧。

论坛徽章:
0
3 [报告]
发表于 2012-09-07 21:28 |只看该作者
但是在的系统上不行,是不是和系统的实现有关呢?是不是信号处理函数只能捆绑一次,然后就解除捆绑了呢

论坛徽章:
0
4 [报告]
发表于 2012-09-08 00:23 |只看该作者
果然是signal函数的问题,在linux中默认是只捆绑信号处理函数一次,改用sigaction就没有问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP