免费注册 查看新帖 |

Chinaunix

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

Linux下setitimer为什么只可以一次有效? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-28 21:04 |只看该作者 |倒序浏览
在Linux下,用setitimer来设置定时器,第一次到时间时可以接收到信号,可是再次使用setitimer来设置时就不能接收到信号了~~~为什么啊?有没有什么解决方法呢?请高手解惑!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-11-28 21:34 |只看该作者
你把代码简单的贴一下.

论坛徽章:
0
3 [报告]
发表于 2005-11-28 21:49 |只看该作者
  1. if(setjmp(jmpbuffer)!=0)
  2.       printf("timehandler return!\n");
  3.         while(1){
  4.         act3.sa_handler = timehandler;
  5.         sigemptyset(&act3.sa_mask);
  6.         act3.sa_flags = 0;
  7.         act3.sa_flags |= SA_RESTART;
  8.         if(sigaction(SIGALRM,&act3,&oact3)<0){
  9.                 printf("sigaction error!\n");
  10.                 exit(0);
  11.         }
  12.                                
  13.                 value.it_value.tv_sec=0;
  14.         value.it_value.tv_usec=10000000;
  15.         value.it_interval = value.it_value;
  16.         setitimer(ITIMER_REAL,&value,NULL);
  17.                 ......
  18.                 }


  19. static void timehandler(int signo)
  20. {
  21.    ........  
  22.    longjmp(jmpbuffer,1);
  23.         return ;
  24. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2005-11-28 21:50 |只看该作者
第二次进入while以后设置的时间就不起作用了~~~

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-11-28 21:52 |只看该作者
setitimer(ITIMER_REAL,&value,NULL); 你判断它是否失败.
setitimer(ITIMER_REAL,&value,NULL)<0
perror一下.看看

论坛徽章:
0
6 [报告]
发表于 2005-11-28 21:58 |只看该作者
没道理第一次成功,第二次就是失败亚。。。
很诡异的说。。。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2005-11-28 21:59 |只看该作者

  1. #include <stdio.h>
  2. #include <sys/time.h>
  3. #include <signal.h>
  4. #include <unistd.h>

  5. void fn(int sign)
  6. {
  7.     printf("recv\n");
  8. }

  9. int main()
  10. {
  11.     struct itimerval value;

  12.     if(signal(SIGALRM,fn)==SIG_ERR)
  13.         perror("signal");
  14.     while(1)
  15.     {
  16.         value.it_value.tv_sec=1;
  17.         value.it_value.tv_usec=0;

  18.         if(setitimer(ITIMER_REAL,&value,NULL)<0)
  19.             perror("setitimer");
  20.         sleep(10);
  21.     }
  22.     return 0;
  23. }
复制代码

我简单的写了一下 没发现什么问题.你看看吧.

论坛徽章:
0
8 [报告]
发表于 2005-11-28 21:59 |只看该作者
原帖由 mq110 于 2005-11-28 21:52 发表
setitimer(ITIMER_REAL,&value,NULL); 你判断它是否失败.
setitimer(ITIMER_REAL,&value,NULL)<0
perror一下.看看

试了,那函数设置是正确的。。。

论坛徽章:
0
9 [报告]
发表于 2005-11-28 22:06 |只看该作者
是很奇怪,可能是我的程序有点问题,不过我们好几个人都出现这种情况,觉得有点蹊跷。。。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-11-28 22:07 |只看该作者
原帖由 jianjinshu 于 2005-11-28 22:06 发表
是很奇怪,可能是我的程序有点问题,不过我们好几个人都出现这种情况,觉得有点蹊跷。。。


因为你的代码贴的不全.我猜测可能问题出在长跳转.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP