当前位置: 技术问答>linux和unix
请教,setitimer的简单测试程序
来源: 互联网 发布时间:2016-07-21
本文导语: 用setitimer设定定时器,代码如下: #include #include #include #include void timerFunc(int sig); bool setTimer(); int main() { signal(SIGALRM, timerFunc); if(setTimer()) { printf...
用setitimer设定定时器,代码如下:
程序运行后,
输出一行wait timer,就停在那里了。
请问,该如何正常执行timerFunc,以及正常退出程序。
谢谢!!
#include
#include
#include
#include
void timerFunc(int sig);
bool setTimer();
int main()
{
signal(SIGALRM, timerFunc);
if(setTimer())
{
printf("set timer failedn");
return 1;
}
else
{
printf("wait timern");
while(1)
{
pause();
}
}
return 0;
}
bool setTimer()
{
struct itimerval myTimer;
myTimer.it_value.tv_sec = 3; //3秒后开始计时
myTimer.it_interval.tv_sec = 5; //之后每隔五秒响应一次
return setitimer(ITIMER_REAL, &myTimer, NULL);
}
void timerFunc(int sig)
{
static int cnt = 5;
printf("timer func: %in", cnt--);
fflush(stdout);
if(cnt == 0)
{
printf("timer func finishedn");
}
}
程序运行后,
输出一行wait timer,就停在那里了。
请问,该如何正常执行timerFunc,以及正常退出程序。
谢谢!!
|
我这里的结果是set timer failed。
我一看,setitimer把errno设成了EINVAL。加上两行之后就好了
myTimer.it_value.tv_usec = 0;
myTimer.it_interval.tv_usec = 0;
局部变量如果不初始化,就是不确定值。看来楼主的RP比我好 :)
然后我又加了一行
if(cnt == 0)
{
printf("timer func finishedn");
exit(0); // 有点简单粗暴了,呵呵
}
就得到了楼主想要的结果:
$ ./a.out
wait timer
timer func: 5
timer func: 4
timer func: 3
timer func: 2
timer func: 1
timer func finished
$
楼主的结果,“输出一行wait timer,就停在那里了”
想不出来是什么原因
我一看,setitimer把errno设成了EINVAL。加上两行之后就好了
myTimer.it_value.tv_usec = 0;
myTimer.it_interval.tv_usec = 0;
局部变量如果不初始化,就是不确定值。看来楼主的RP比我好 :)
然后我又加了一行
if(cnt == 0)
{
printf("timer func finishedn");
exit(0); // 有点简单粗暴了,呵呵
}
就得到了楼主想要的结果:
$ ./a.out
wait timer
timer func: 5
timer func: 4
timer func: 3
timer func: 2
timer func: 1
timer func finished
$
楼主的结果,“输出一行wait timer,就停在那里了”
想不出来是什么原因
|
稍微温和一点的办法,把main里面的while(1)改成while(某个全局变量),然后在timerFunc里面修改这个全局变量
|
就是, 忘记说了, 楼主忘记初始化usec了, 楼上有理, 可以把while(1) 改成某个全局变量来试试, 建议while 条件的变量上加 volatile 修饰, signal处理函数里对while条件进行处理。 完毕。
|
定时器是系统提供的功能, 由系统内部实现或者对系统的功能进行包装实现的。
程序可以不用阻塞在while里的pasue, 但是程序必须没有推出才能接受到定时器的信号, 所以必须保证程序没有推出就可以, 如果只是需要实现超时5次后推出, 可以使用全局变量来做while的条件来实现。
|
代码如下:
#include
#include
#include
#include
#include
typedef int bool;
void timerFunc(int sig);
bool setTimer();
volatile bool IsFinishedB = 0;
int main()
{
signal(SIGALRM, timerFunc);
if(setTimer())
{
printf("set timer failedn");
return 1;
}
else
{
printf("wait timern");
while(IsFinishedB != 1)
{
pause();
}
}
printf("exit.n");
return 0;
}
bool setTimer()
{
struct itimerval myTimer;
memset(&myTimer, 0, sizeof(myTimer));
myTimer.it_value.tv_sec = 3; //3绉掑悗寮€濮嬭鏃?
myTimer.it_interval.tv_sec = 5; //涔嬪悗姣忛殧浜旂鍝嶅簲涓€娆?
return setitimer(ITIMER_REAL, &myTimer, NULL);
}
void timerFunc(int sig)
{
static int cnt = 5;
printf("timer func: %in", cnt--);
fflush(stdout);
if(cnt == 0)
{
printf("timer func finishedn");
IsFinishedB = 1;
}
}