当前位置: 技术问答>linux和unix
定时器问题--setitimer 求助
来源: 互联网 发布时间:2016-02-01
本文导语: #include #include #include #include #include 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 = ...
#include
#include
#include
#include
#include
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.. %dn", 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的用法没有对,请大家测试一下这个程序是否是我说的一样?
#include
#include
#include
#include
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.. %dn", 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;
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;
|
看上去是gcc优化导致的问题,估计你编译时有加入-O1/-O2之类的选项,你可以通过gcc -O2 -S 的方式看汇编代码,我在Red Hat Linux 9.0上看到的是对应的代码优化后会有问题。
修改方法有几种,直最接的一种是直接将bTimeOver加上修饰符volatile以避免gcc做不应该的优化。
修改方法有几种,直最接的一种是直接将bTimeOver加上修饰符volatile以避免gcc做不应该的优化。
|
乖乖, 居然敢用KDevelop ... ...
这种东西也能用? 还不如直接Makefile搞定
这种东西也能用? 还不如直接Makefile搞定
|
关注。。。