免费注册 查看新帖 |

Chinaunix

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

请问信号的问题~~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-27 18:00 |只看该作者 |倒序浏览
#include<stdio.h>
#include<signal.h>

int a=0;

void handle(int sig)
{
    signal(SIGINT,handle);
    a++;
    sleep(5);
}

int main()
{
    signal(SIGINT,handle);
    pause();
    printf("a=%d\n",a);
}

请问一下:
为什么按了很多下ctrl+C都只是输出a=2 ?

论坛徽章:
0
2 [报告]
发表于 2008-12-27 19:36 |只看该作者
有人能解释一下吗?????
给点反应吧

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2008-12-27 19:52 |只看该作者
signal函数语义不明确,不推荐使用。

论坛徽章:
0
4 [报告]
发表于 2008-12-27 19:56 |只看该作者
语义不明确
什么意思?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2008-12-27 20:02 |只看该作者
也就是不同的UNIX的signal函数有差别,也就是当调用signal的时候,大家搞不清楚调用者到底想干什么。

论坛徽章:
0
6 [报告]
发表于 2010-02-27 10:37 |只看该作者
本帖最后由 lanying_wzw 于 2010-02-27 10:47 编辑

不同操作系统结果不同,也不总是2,跟signal和sleep的实现有关

论坛徽章:
0
7 [报告]
发表于 2010-02-27 10:56 |只看该作者

  1. #include<stdio.h>
  2. #include<signal.h>

  3. int a=0;

  4. void print_pending();

  5. void handle(int sig)
  6. {
  7.     signal(SIGINT,handle);
  8.     a++;
  9.     printf("starting sleep\n");
  10.     sleep(5);
  11.     print_pending();
  12.     printf("end sleep\n");
  13. }

  14. int main()
  15. {
  16.     signal(SIGINT,handle);
  17.     pause();
  18.     printf("a=%d\n",a);
  19. }

  20. void print_pending()
  21. {
  22.     sigset_t set;

  23.     sigemptyset(&set);
  24.     sigpending(&set);
  25.     if (sigismember(&set, SIGINT)) {
  26.         printf("SIGINT is pending\n");
  27.     }
  28. }
复制代码
帮楼主把代码改了一下,试试这个你就明白为什么会输出那样的结果了

论坛徽章:
0
8 [报告]
发表于 2010-02-27 20:50 |只看该作者
在执行信号处理函数期间,SIGINT被屏蔽,你在信号处理函数中sleep时,按下ctrl+C,终端驱动发送一个SIGINT给进程,但因SIGINT被屏蔽,故内核在产生该信号时不会将进程唤醒,SIGINT处于pending状态。随后你多次按下ctrl+C,但因已有一个pending的SIGINT,故内核不会再产生新的SIGINT。

你可以先快速连按2次ctrl+C,然后每隔5秒按一次ctrl+C,这样就能把a一直加下去
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP