Linux下setitimer为什么只可以一次有效?

发布于 2022-09-30 07:58:47 字数 93 浏览 18 评论 0

在Linux下,用setitimer来设置定时器,第一次到时间时可以接收到信号,可是再次使用setitimer来设置时就不能接收到信号了~~~为什么啊?有没有什么解决方法呢?请高手解惑!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

贱人配狗天长地久 2022-10-07 07:58:47

你把代码简单的贴一下.

离笑几人歌 2022-10-07 07:58:47
  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. }

复制代码

疯狂的代价 2022-10-07 07:58:47

第二次进入while以后设置的时间就不起作用了~~~

維他命╮ 2022-10-07 07:58:47

setitimer(ITIMER_REAL,&value,NULL); 你判断它是否失败.
setitimer(ITIMER_REAL,&value,NULL)<0
perror一下.看看

陈独秀 2022-10-07 07:58:47

没道理第一次成功,第二次就是失败亚。。。
很诡异的说。。。

仅此而已 2022-10-07 07:58:47
  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. }

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

往昔成烟 2022-10-07 07:58:47

原帖由 mq110 于 2005-11-28 21:52 发表
setitimer(ITIMER_REAL,&value,NULL); 你判断它是否失败.
setitimer(ITIMER_REAL,&value,NULL)<0
perror一下.看看

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

江南烟雨〆相思醉 2022-10-07 07:58:47

是很奇怪,可能是我的程序有点问题,不过我们好几个人都出现这种情况,觉得有点蹊跷。。。

把回忆走一遍 2022-10-07 07:58:47

原帖由 jianjinshu 于 2005-11-28 22:06 发表
是很奇怪,可能是我的程序有点问题,不过我们好几个人都出现这种情况,觉得有点蹊跷。。。

因为你的代码贴的不全.我猜测可能问题出在长跳转.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文