time.h中定义的函数


clock_gettime

clock_settime

clock_getres

用法

#include<time.h>

int clock_getres(clockid_t clockid,struct timespec *res);

int clock_gettime(clockid_t clockid,struct timespec *tp);

int clock_settime(clockid_t clockid,const struct timespec *tp);

简介及参数

函数clock_getres()得到clock clockid 的精度(resolution或precision),并且如果res非空,将其存储在res所指向的地址处。时钟的精度取决于它的实现方式,不能通过某个特定的过程进行配置。如果clock_settime()中tp指针所指向的time值不是res的倍数,那么它会被截断为res的倍数。

函数clock_gettime()以及clock_settime()分别用于检索和设置由clockid指定的时钟时间,返回值为timespec结构体,在<time.h>中进行了定义:

struct timespec {
        time_t   tv_sec;        /* seconds */
        long     tv_nsec;       /* nanoseconds */
};

clockid变量是用于辨别在哪个的clock上进行操作的identifier。一个clock可以是system-wide(此时对所有进程都是visible的),也可以是每个进程独有的(仅在某个进程内测量时间)。

所有的implementations都支持system-wide的实时clock,由CLOCK_REALTIME进行分辨。它的时间表示从Epoch开始的second以及nanosecond。当这个时间发生改变时,用于判断相对时间间隔的timer不会受到影响,但是用于判断一个绝对的时间点的timer会受到影响。

Sufficiently recent versions of glibc and the Linux kernel support the following clocks:

  • CLOCK_REALTIME:这是一个可设置的system-wide clock,用于衡量真实(wall-clock)时间。设置这个clock需要一定的权限。这个clock受到系统时间中的discontinuous jump的影响(例如,如果系统管理员手动改变了clock),同时受到adjtime(3)以及NTP所执行的incremental adjustment的影响。

返回值

clock_gettime(),clock_settime()以及clock_getres()执行成功时返回0,执行失败时返回-1并且设定errno来指示发生了什么错误。

使用示例

如下的程序阐述了如何对不同的clock使用clock_gettime()以及clock_getres():

//源代码
#define _XOPEN_SOURCE 600
#include<time.h>
#include<stdint.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

#define SECS_IN_DAY (24*60*60)

static void displayClock(clockid_t clock,const char *name,bool showRes){
	struct timespec ts;

	if(clock_gettime(clock,&ts)==-1){
		perror("clock_gettime");
		exit(EXIT_FAILURE);
	}

	printf("%-15s: %10jd.%03ld (",name,(intmax_t)ts.tv_sec,ts.tv_nsec/1000000);

	long days=ts.tv_sec/SECS_IN_DAY;
	if(days>0)
		printf("%ld days + ",days);

	printf(%2dh %2dm %2ds",(int)(ts.tv_sec % SECS_IN_DAY) /3600),(int)(ts.tv_sec%3600)/60,(int)ts.tv_sec%60);
	printf(")\n");

	if(clock_getres(clock,&ts)==-1){
		perror("clock_getres");
		exit(EXIT_FAILURE);

	if(showRes)
		printf("    resolution: %10jd.%09ld\n",(intmax_t) ts.tv_sec,ts.tv_nsec);
	}

	int main(int argc,char *argv[]){
		bool showRes=argc>1;
		displayClock(CLOCK_REALTIME,"CLOCK_REALTIME",showRes);
	#ifdef CLOCK_TAI
		displayClock(CLOCK_TAI,"CLOCK_TAI",showRes);
	#endif
		displayClock(CLOCK_MONOTONIC,"CLOCK_MONOTONIC",showRes);
	#ifdef CLOCK_BOOTTIME
		displayClock(CLOCK_BOOTTIME,"CLOCK_BOOTTIME",showRes);
	#endif
		exit(EXIT_SUCCESS);
	}
}

函数执行及输出结果如下:

$ ./clock_times x
CLOCK_REALTIME : 1585985459.446 (18356 days +  7h 30m 59s)
    resolution:          0.000000001
CLOCK_TAI      : 1585985496.447 (18356 days +  7h 31m 36s)
    resolution:          0.000000001
CLOCK_MONOTONIC:      52395.722 (14h 33m 15s)
    resolution:          0.000000001
CLOCK_BOOTTIME :      72691.019 (20h 11m 31s)
    resolution:          0.000000001

参考


time

使用方式

#include<time.h>

time_t time(time_t *tloc);

简介

这个函数返回从Epoch(1970-01-01 00:00:00 +0000,UTC)开始经过的秒数。

如果tloc非空,那么返回值会被储存在tloc指向的内存地址。

返回值

如果函数成功执行,那么返回从Epoch开始经过的秒数。如果执行失败,那么返回((time_t)-1) ,并且设定errno来指示发生了什么错误。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值