linux 定时函数setitimer使用

linux 定时函数setitimer使用

  • 头文件
#include 
  • 函数原型
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

第一个参数:which表示类型:
ITIMER_REAL:以系统真实的时间来计算,计时到期后发出SIGALRM信号。
ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,计时到期后发出SIGVTALRM信号。
ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算。计时到期后发出SIGPROF信号。
第二个参数:new_value用来对计时器进行延时设置,it_interval为计时间隔,it_value为延时时长。
第三个参数:old_value通常设置为NULL,用来存储上一次setitimer调用时设置的new_value值。
返回值:成功返回0, 失败返回-1。

itimerval结构体

struct itimerval 
{
    struct timeval it_interval; /* Interval for periodic timer */
    struct timeval it_value;    /* Time until next expiration */
};

struct timeval 
{
    time_t      tv_sec;         /* seconds */
    suseconds_t tv_usec;        /* microseconds */
};

settimer工作机制是,先对it_value倒计时,当it_value为零时会触发信号,然后重置为it_interval,继续对it_value倒计时。一直这样循环下去。
基于此机制。setitimer既能够用来延时运行,也可定时运行。

注意:如果将it_value设置为0将不会触发信号,而it_interval为0则不会定时。

  • 例子
#include 
#include 
#include 
#include 

#define COUNT_SEC 1
#define COUNT_USEC 0

static void Timer_Test(int sig)
{
    printf("This is a Test\n");
}

/*Initialize timer*/
static void Init_timer(struct itimerval *tick)
{
    int ret;
    memset(tick, 0, sizeof(struct itimerval));

    /*initialize it_value*/
    tick->it_value.tv_sec = COUNT_SEC;     
    tick->it_value.tv_usec = COUNT_USEC;

    /*initialize it_interval*/
    tick->it_interval.tv_sec = COUNT_SEC;    
    tick->it_interval.tv_usec = COUNT_USEC;

    return;
}

int main(int argc, const char * argv [])
{
    int ret = 0;
    struct itimerval tick;

    signal(SIGALRM, Timer_Test);

    Init_timer(&tick);

    ret = setitimer(ITIMER_REAL, &tick, NULL);
    if(ret < 0)
    {
        perror("setitimer");
        return -1;
    }
    for (;;);  //此处循环使主函数不结束。主函数结束后定时函数也将结束。
    return 0;
}

你可能感兴趣的:(Linux)