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)
上一篇: 在OpenCV里实现高斯拉普拉斯变换
下一篇: [Oracle]分区索引