Linux时间函数与定时器简介

1.Linux时间函数

(1)相关函数

#include<sys/time.h>

struct timeval
{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};

int gettimeofday(struct timeval *tv,struct timezone *tz)
//函数调用成功返回0,失败返回-1

(2)函数作用:gettimeofday()会把目前的时间用tv结构体返回,当地时区的信息则放到tz所指的结构中,第二个参数是一个时区结构,已经过时了,所以tz参数通常应该指定为NULL

(3)代码示例:计算程序在当前环境中数数10万次耗时多少

#include <sys/time.h>
#include <stdio.h>

void mydelay()  //数10万次
{
    int i,j;
    for(i=0;i<100;i++){
        for(j=0;j<1000;j++);
    }
}

int main()
{
    struct timeval startTime;
    struct timeval stopTime;
    gettimeofday(&startTime,NULL);
    mydelay();
    gettimeofday(&stopTime,NULL);

    long diffTime = 1000000*(stopTime.tv_sec - startTime.tv_sec) +
    (stopTime.tv_usec - startTime.tv_usec);
    printf("全志H6的Linux数100000耗时%ldus\n",diffTime);
    
    return 0;
}

2.Linux定时器

(1)相关函数

#include<sys/time.h>

struct itimerval
{
    /* Value to put into `it_value' when the timer expires. */
    struct timeval it_interval;
    /* Time to the next timer expiration. */
    struct timeval it_value;
};

/*it_interval:计时器的初始值,设定定时器的时间
  it_value:设定定时器开始生效的时间,延迟多长时间执行定时器*/

struct timeval
{
    __time_t tv_sec; /* Seconds. */
    __suseconds_t tv_usec; /* Microseconds. */
};
int setitimer (__itimer_which_t __which, /*设置定时方式*/
               const struct itimerval *__restrict __new, /*设置定时器的属性,传入struct itimerval结构体*/
               struct itimerval *__restrict __old) /*记录上一次的定时的时间参量,一般不使用,指定NULL/

setitimer()将value指向的结构体设为计时器的当前值,如果ovalue不是NULL,将返回计时器原有值。

which:三种类型

ITIMER_REAL :数值为0,计时器的值实时递减,发送的信号是SIGALRM

ITIMER_VIRTUAL :数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRMITIMER_PROF:数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF

很明显,这边需要捕获对应的信号进行逻辑相关处理 signal(SIGALRM,signal_handler);

返回说明: 成功执行时,返回0。失败返回-1

(2)代码示例:每隔一秒打印一个hello

#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>

static int i;

void signal_handler(int signum)
{
     i++;
     if(i == 2000){ /*数2000个500us*/
         printf("hello\n");
         i = 0;
    }
}

int main()
{
     struct itimerval itv;

     /*设置定时时间*/
     itv.it_interval.tv_sec = 0;
     itv.it_interval.tv_usec = 500;
     /*设置开始生效,定时器启动时间*/
     itv.it_value.tv_sec = 1;
     itv.it_value.tv_usec = 0;
     /*设置定时方式*/
     if(-1 == setitimer(ITIMER_REAL, &itv, NULL)){
        perror("error");
        exit(-1);
     }
     /*信号处理*/
     signal(SIGALRM,signal_handler);

     while(1);
     return 0;
}

猜你喜欢

转载自blog.csdn.net/aaaaaaaa123345/article/details/128898374