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

linux下时间类型与时间函数总结

程序员文章站 2024-01-22 21:44:34
...

本篇是基于APUE总结的.

时间值

UNIX以及类UNIX系统使用两种不同的时间值.
1.日历时间:该值是自协调世界时(UTC)1970年1月1日00:00:00这个特定时间以来所经过的秒数累计值.UTC也称为格林尼志标准时间.系统基本数据类型time_t用于保存这种时间值.
2.进程时间:也称为CPU时间,用以度量进程使用的CPU资源.进程时间以时钟滴答计算.系统基本数据类型clock_t用于保存这种时间值.
UNIX系统为一个进程维护了3个进程时间值:
1.时钟时间,又称墙上时钟时间,它是进程运行的总时间,其值与系统中同时运行的进程数有关.
2.用户CPU时间,指进程执行用户指令所用的时间,即进程在用户态的运行时间.
3.系统CPU时间,指进程执行内核程序所经历的时间,即进程在系统态的运行时间.
进程的三种状态:阻塞,就绪,运行.
时钟时间=阻塞时间+就绪时间+运行时间.
运行总时间=用户CPU时间+系统CPU时间.
在多核处理器上,若进程中有多个线程或者子进程,那么进程的实际运行时间(时钟时间)有可能小于运行总时间(CPU时间),因为不同的线程或者进程可以并发执行,但其时间会计入进程的CPU总时间.

时间类型

//基本数据类型:
clock_t // 时钟滴答的计数器
time_t // 日历时间的秒计数器
// 复合数据类型
struct timeval {
	time_t tv_sec; // 秒
	long tv_usec; // 微秒
}
struct timespec {
	time_t tv_sec; // 秒
	long tv_nsec; // 纳秒
	// 其他字段
}
struct tm { // a broekn-down time
	int tm_sec; // seconds after the minute [0-60]
	int tm_min; // minutes after the hour [0-59]
	int tm_hour; // hours after midnight [0-23]
	int tm_mday; // day of the month [1-31]
	int tm_mon; // months since January [0-11]
	int tm_year; // years since 1900
	int tm_wday; // days since Sunday [0-6]
	int tm_yday; // days since January 1 [0-365]
	int tm_isdst; // daylight saving time flag <0, 0, >0
}

以上几个数据类型的唯一区别是: struct tm是人类可读的.

时间函数

#include <time.h>
timet_t time(time_t *calptr)
// 若成功,返回时间值,若出错,返回-1
// 返回的时间值是自UTC以来的秒数.

// example1
// 参数为空,返回自UTC以来的秒数
time_t now;
now = time(NULL);

// example2
// 参数不为空,返回值和参数都为UTC以来的秒数.
time_t now1, now2;
now1 = time(now2);
标识符 说明
CLOCK_REALTIME 实时系统时间
CLOCK_MONOTONIC 不带负跳数的实时系统时间
CLOCK_PROCESS_CPUTIME_ID 调用进程的CPU时间
CLOCK_THREAD_CPUTIME_ID 调用线程的CPU时间
#include <sys/time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tsp);
// 若成功返回0,若出错返回-1
int clock_settime(clockid_t clock_id, struct timespec *tsp);
// 若成功返回0,若出错返回-1
#include <sys/time.h>
int gettimeofday(struct timeval *tp, void * tzp);
// 函数是总是返回0
// tzp的唯一合法值是NULL
// 此函数不可移植

时间转换函数

#include <time.h>
// gmtime将日历时间转换为UTC时间
struct tm * gmtime(const time_t *calptr);
// localtime将日历时间转换成本地时间
struct tm * localtime(const time_t *calptr);
// mktime将本地时间转换为日历时间
time_t mktime(struct tm *tmptr);
// 将分解时间打印成字符串
size_t strftime(char *buf, size_t maxsize, const char *format, const struct tm *tmptr)
// 将字符串转换为分解时间
char * strptime(const char *buf, const char *format, struct tm *tmptr)
相关标签: linux api