欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux时间结构体与函数

程序员文章站 2024-01-23 17:08:28
...
【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) 

Linux时间结构体与函数

clockid_t, struct timespec

clock_getres(), clock_gettime(), clock_settime() - clock and time functions

/**
 * 头文件
 */
#include <time.h>

/**
 * 函数参数1. clockid_t clk_id
 * 	int类型变量, 表示是要操作的特定时钟的标识符
 * 	值一般为CLOCK_MONOTONIC, 表示系统开机到现在的时钟
 * 
 *  CLOCK_REALTIME			系统从1970.1.1零时到现在的时间
 *  CLOCK_MONOTONIC			系统从开机到现在的时间(不能被设置)
 * 	CLOCK_PROCESS_CPUTIME_ID	进程运行时间
 *  CLOCK_THREAD_CPUTIME_ID		线程运行时间
 * 	CLOCK_REALTIME_HR		CLOCK_REALTIME的高精度版本
 *  CLOCK_MONOTONIC_HR		CLOCK_MONOTONIC的高精度版本
 */
clockid_t clk_id

/**
 * 函数参数2. struct timespec
 * 	时间结构体
 */
struct timespec {
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};

// 获取特定时钟的时间精度
int clock_getres(clockid_t clk_id, struct timespec *res);
// 获取特定时钟的时间精度
int clock_gettime(clockid_t clk_id, struct timespec *tp);
// 设置特定时钟的时间精度
int clock_settime(clockid_t clk_id, const struct timespec *tp);

/**
 * 注意事项
 */
Link with -lrt (only for glibc versions before 2.17).

举个例子(计时, 精确到纳秒级):

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<unistd.h>

static int64_t get_clock(void)
{
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC,&ts);
    return ts.tv_sec*1000000000LL+ts.tv_nsec;
}

int main()
{
    int64_t timer1,timer2;
	struct timeval starttime,endtime;
	double timeuse;
	
    timer1=get_clock();
    system("sleep 2");
    timer2=get_clock();
    printf("timer1=%ld\ntimer2=%ld\n",timer1,timer2);

    return 0;
}

struct timeval, struct timezone

gettimeofday, settimeofday - get / set time

/**
 * 头文件
 */
#include <sys/time.h>

/**
 * 函数参数1. struct timeval
 */
struct timeval {
    time_t  tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

/**
 * 函数参数2. struct timezone
 */
struct timezone {
    int tz_minuteswest;     /* minutes west of Greenwich, 以格林威治时间为基准向西算的分钟数, 相当于和格林威治时间差了多少分钟(个人觉得不会用到) */
    int tz_dsttime;         /* type of DST correction, 夏令时修正类型 */
};

// 自1970年1月1日零时到现在的时间
int gettimeofday(struct timeval *tv, struct timezone *tz);

int settimeofday(const struct timeval *tv, const struct timezone *tz);

举个例子(计时, 精确到微秒级):

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

int main()
{
	struct timeval starttime,endtime;
	double timeuse;

	gettimeofday(&starttime,NULL);
	sleep(2);
	gettimeofday(&endtime,NULL);
	timeuse=1000000*(endtime.tv_sec-starttime.tv_sec)+endtime.tv_usec-starttime.tv_usec;
	timeuse/=1000000;
	printf("timeuse=%f \n",timeuse);

    return 0;
}