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,进程执行时递减计时器的值,发送的信号是SIGVTALRM。 ITIMER_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;
}