Linux 定时器编程


一、Linux应用程序定时器

用到的数据结构为:

           struct itimerval {

               struct timeval it_interval; /* next value */

               struct timeval it_value;    /* current value */

           };

其中it_value用于设置第一次定时器到达并发送信号的时间,it_interval用于设置定时器终止后的重设值.若为0则定时器在终止后将失效;若不为0,则定时器终止后,将会以该值进行重新定时。

           struct timeval {

               long tv_sec;                /* seconds */

               long tv_usec;               /* microseconds */

           };

int setitimer(int which, const struct itimerval *new_value,

                     struct itimerval *old_value);

设置定时器间隔,其中第一个变量which的取值如下:

ITIMER_REAL :以系统真实的时间来计算,它送出SIGALRM信号。

ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。

ITIMER_PROF :以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF   

号。

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

该函数用于设置某一信号的对应处理函数,对定时器来说信号有:SIGALRM、SIGVTALRM、SIGPROF; handler用于设置某一信号到来时的处理函数。所在头文件signal.h

下面是示例程序

#include <stdio.h>

#include <string.h>

#include <signal.h>

#include <unistd.h>

#include <sys/time.h>

/*设置定时器到达时间*/

#define REFRESH_TIME 10

/*设置定时器*/

void set_refresh_time(int sec)

{

        struct itimerval nvalue;

        nvalue.it_value.tv_sec = sec;

        nvalue.it_value.tv_usec = 0;

     nvalue.it_interval.tv_sec = sec;//每隔sec时间触发一次定时器

        nvalue.it_interval.tv_usec = 0;

/*此处使用的是ITIMER_REAL,所以对应的是SIGALRM信号*/

        setitimer(ITIMER_REAL, &nvalue, NULL);

}

/*定时器处理函数*/

void timer_handler(int msg)

{

        switch(msg)

        {

                case SIGALRM:

                        printf("to do someting when set timer is comming\n");

                        break;

                default:

                        break;

        }

        return ;

}

int main(int argc, char **argv)

{

int value;

/*设置SIGALRM信号的处理函数,即定时器处理函数*/

        signal(SIGALRM, timer_handler);

if(!argv[1])

{

Printf("use default time %d\n", REFRESH_TIME);

/*设置定时器*/

         set_refresh_time(REFRESH_TIME);

}

else

{

value = atoi(argv[1]);

set_refresh_time(value);

}

        while(1)

        {

        }

}

  • 1
  • 2
  • 下一页

相关内容