Linux 时间类型与时间函数

本文深入探讨了UNIX系统中的时间概念,包括日历时间和进程时间的区别与联系。解析了time_t和clock_t数据类型,以及struct timeval、struct timespec和struct tm等复合数据类型的应用。详细介绍了时间获取和设置函数,如time()、clock_gettime()和clock_settime(),以及时间转换函数gmtime()、localtime()和mktime()。通过实例展示了如何在程序中操作和显示时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇是基于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)

各个时间函数之间的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值