当前位置:  技术问答>linux和unix

再问定时器-setitimer问题

    来源: 互联网  发布时间:2016-02-26

    本文导语:  #include  #include  #include  #include  #include  bool bTimeOver = false; void set_timer() {         struct itimerval itv, oldtv;         itv.it_value.tv_sec = 5;         itv.it_value.tv_usec = 0;         itv.it_interval.tv_sec = 0;...

#include 
#include 
#include 
#include 
#include 

bool bTimeOver = false;

void set_timer()
{
        struct itimerval itv, oldtv;
        itv.it_value.tv_sec = 5;
        itv.it_value.tv_usec = 0;
        itv.it_interval.tv_sec = 0; //只执行一次
        itv.it_interval.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的用法没有对,请大家测试一下这个程序是否是我说的一样?再次恳求高手测试一下,给我指点。

|
SIGALRM属于“不可靠信号”,进程每次处理信号后,就将对信号的响应设置为默认动作;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。


/*
 *  testtimer.c - test linux timer
 *
 */
/*
 * 下面是关于setitimer调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号
 * 此函数的问题,如果在sigroutine中的printf中没有'n',函数无法正常运行,怀疑和缓冲区有关
*/
#include 
#include 
#include 
#include 


void sigroutine(int signo){
printf("Catch a signal -- SIGALRM %d n", signo);
signal(SIGALRM, sigroutine);
return;
}

int main()
{
struct itimerval value1, ovalue;

printf("process id is %d n", getpid());

signal(SIGALRM, sigroutine);

value1.it_value.tv_sec = 0;
value1.it_value.tv_usec = 200000;
value1.it_interval.tv_sec = 0;
value1.it_interval.tv_usec = 200000;
setitimer(ITIMER_REAL, &value1, &ovalue);

for(;;)
;

}


|
我在cygwin下的结果:

/*
 *  test.c
 *
 */

#include 
#include 
#include 
#include 
#include 

#define DEBUG

int iTimeOver=0;

void set_timer()
{
struct itimerval itv, oldtv;

#ifdef DEBUG
printf("[ test.c ] start run set_timer() n");
#endif

itv.it_value.tv_sec = 5;
itv.it_value.tv_usec = 0;
itv.it_interval.tv_sec = 5; //只执行一次
itv.it_interval.tv_usec = 0;
        
setitimer(ITIMER_PROF, &itv, &oldtv); 

#ifdef DEBUG
printf("[ test.c ] exit set_timer() n");
#endif

}

void sigalrm_handler(int sig)
{
#ifdef DEBUG
printf("[ test.c ] start run sigalrm_handler() n");
#endif

iTimeOver = 1;
printf("timer signal.. %dn", sig);

#ifdef DEBUG
printf("[ test.c ] exit sigalrm_handler() n");
#endif
}

void init_sigaction( void ) 

struct sigaction act; 

#ifdef DEBUG
printf("[ test.c ] start run init_sigaction() n");
#endif

act.sa_handler = sigalrm_handler; 
act.sa_flags = 0; 
if( !sigemptyset(&act.sa_mask) )
printf("sigemptyset() returen error n"); 
if( !sigaction(SIGPROF, &act, NULL) )
printf("sigaction() returen error n"); 

#ifdef DEBUG
printf("[ test.c ] exit init_sigaction() n");
#endif


int main( void )
{
init_sigaction();
set_timer();
while(1)
{
if( iTimeOver )
break;
}

exit(0);
}

/* END */



[ test.c ] start run init_sigaction() 
sigemptyset() returen error 
sigaction() returen error 
[ test.c ] exit init_sigaction() 
[ test.c ] start run set_timer() 
[ test.c ] exit set_timer() 

|
btw: while循环中是不是需要一个分号,

|
SIGALRM属于“不可靠信号”,进程每次处理信号后,就将对信号的响应设置为默认动作;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。

--------------------------------------

signal 存在你说的这种情况。
但sigaction设置的信号句柄不存在你所的情况。响应信号后,并不恢复设置为默认。

    
 
 

您可能感兴趣的文章:

  • linux下该如何取消用setitimer设置的定时器呢?
  • 定时器问题--setitimer 求助
  • 定时器的问题请教
  • 定时器与getchar()的问题??奇怪!
  • linux 多个定时器 几乎同时到时 , 部分定时器信号 丢失的问题.
  • 关于select定时器的问题
  • 有关定时器在多核CPU上运行的一个问题?
  • 多定时器问题
  • socket属性问题和定时器问题
  • 关于linux的定时器问题
  • 定时器问题
  • linux 定时器问题
  • RTAILinux定时器的运用问题
  • C# Timer定时器控件运行时需要修改系统时间的问题
  • 菜鸟 请问一个定时器的问题
  • posix定时器问题“undefined reference to `timer_create'”
  • 定时器的小问题
  • 关于在 red hat 下用posix timer实现高精度定时器的问题 急!!!
  • 定时器相关问题
  • 菜鸟求助关于定时器的问题
  • linux2.6下面的定时器问题 100分
  • 定时器问题,简单但高分!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux用户态可以通过同一段程序创建多个定时器么?
  • 请问如何实现多个并行的定时器?
  • 想做个定时器,不知道怎么做?
  • Jquery定时器的简单示例
  • 请问linux下的定时器怎么使用??******************************
  • 定时器如何销毁?
  • linux 定时器销毁
  • 请教关于unix中定时器的语法
  • linux中的串口通信判断一帧数据是否传输完整时,用定时器检查前后两帧数据的间隔时间,该用什么定时函数,有详细代码最好,谢谢!
  • tcp重传定时器,怎么实现的啊?
  • Linux 提供的基于文件描述符的定时器接口
  • 如何实现多定时器?
  • linux下如何设置高精度定时器?
  • linux定时器!
  • 实时时钟RTC和系统定时器的联系?
  • 测试linux定时器
  • 请问Linux下如何使用定时器?
  • MySQL定时器EVENT学习笔记
  • linux动态定时器插入时 我没想明白
  • JavaScript定时器 Timer.js


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3