日期:2014-05-16  浏览次数:20644 次

定时器问题--setitimer 求助
#include   <stdio.h>
#include   <time.h>
#include   <sys/time.h>
#include   <stdlib.h>
#include   <signal.h>

bool   bTimeOver   =   false;

void   set_timer()
{
                struct   itimerval   itv,   oldtv;
                itv.it_interval.tv_sec   =   5;
                itv.it_interval.tv_usec   =   0;
                itv.it_value.tv_sec   =   0;
                itv.it_value.tv_usec   =   0;

                setitimer(ITIMER_PROF,&itv,oldtv);  
}

void   sigalrm_handler(int   sig)
{
                bTimeOver   =   true;
                printf( "timer   signal..   %d\n ",   count);
}

void   init_sigaction(void)  
{  
              struct   sigaction   act;  
              act.sa_handler=sigalrm_handler;  
              act.sa_flags=0;  
              sigemptyset(&act.sa_mask);  
              sigaction(SIGPROF,&act,NULL);  
}  

int   main()
{
                init_sigaction;
                set_timer();
                while   (!bTimeOver)
                {}
                exit(0);
}

这是通用的处理定时器的程序,请各位测试一些,时间到是bTimeOver   =   true,但为什么在main函数中调不出while循环?

在跟踪的时候发现定时器到时bTimeOver   会被置位true,但是就是跳不出while循环,请问是那个地方的问题,还是setitimer的用法没有对,请大家测试一下这个程序是否是我说的一样?

------解决方案--------------------
你设置错了.

tv.it_interval.tv_sec = 5; //经过多成时间后重新设定settime()
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 0; //设定的时间,你设成0当然不行啦,改成其他值就可以了
itv.it_value.tv_usec = 0;
------解决方案--------------------
乖乖, 居然敢用KDevelop ... ...
这种东西也能用? 还不如直接Makefile搞定

------解决方案--------------------
看上去是gcc优化导致的问题,估计你编译时有加入-O1/-O2之类的选项,你可以通过gcc -O2 -S 的方式看汇编代码,我在Red Hat Linux 9.0上看到的是对应的代码优化后会有问题。

修改方法有几种,直最接的一种是直接将bTimeOver加上修饰符volatile以避免gcc做不应该的优化。
------解决方案--------------------
关注。。。