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来指示发生了什么错误。