一,当前时间
特别注意时区对时间获取/设置影响,如果设备时区是东八,那么time_t 0代表是1970 01-01 08:00:00 ,如果是UTC时间代表的是 00:00:00
1、系统调用
gettimeofday/settimeofday微妙级,结构体timeval{time_t tv_sec; suseconds_t tv_usec;};
clock_gettime/clock_settime:纳秒级,结构体timespec{time_t tv_sec; long tv_nsec;};
CLOCK_REALTIME:System-wide realtime clock. Setting this clock requires appropriate privileges.
CLOCK_MONOTONIC:Clock that cannot be set and represents monotonic time since some unspecified starting point.
CLOCK_PROCESS_CPUTIME_ID:High-resolution per-process timer from the CPU.
CLOCK_THREAD_CPUTIME_ID:Thread-specific CPU-time clock.
2、库调用
time stime:秒级,底层调用clock_gettime/clock_settime
ftime: 底层调用clock_gettime, 获取时间 结构体 struct timeb {time_t time;unsigned short millitm;short timezone;short dstflag;};
ctime/asctime:格式固定一般不用(Wed Feb 13 15:46:11 2013)
strftime/strptime:tm str 双向转化
gmtime/mktime/localtime:tm time_t 双向转化
二,进程时间
进程时间指的是进程创建后到目前使用 CPU 资源的时间总数,注意他的精度是1.0/sysconf(_SC_CLK_TCK),比clock_gettime低很多.如果想获取现实时间请用clock_gettime内核把 CPU 时间(进程时间)分为以下两个部分:
⚫ 用户 CPU 时间:进程在用户空间(用户态)下运行所花费的 CPU 时间。有时也成为虚拟时间(virtualtime)。
⚫ 系统 CPU 时间:进程在内核空间(内核态)下运行所花费的 CPU 时间。这是内核执行系统调用或代表进程执行的其它任务(譬如,服务页错误)所花费的时间。
进程时间=CPU时间=用户 CPU 时间+系统 CPU 时间
现实时间=进程时间+程序挂起/休眠时间
1、系统调用 clock_t times(struct tms *buf)
struct tms { clock_t tms_utime; /* user time, 进程的用户 CPU 时间, tms_utime 个系统节拍数 */ clock_t tms_stime; /* system time, 进程的系统 CPU 时间, tms_stime 个系统节拍数 */ clock_t tms_cutime; /* user time of children, 已死掉子进程的 tms_utime + tms_cutime 时间总和 */ clock_t tms_cstime; /* system time of children, 已死掉子进程的 tms_stime + tms_cstime 时间总和 */ };
函数返回值为进程时间,通常使用上要判断一段代码使用时间分别在代码前后2次调用,根究时间差计算时间,这里的值并不是真正的时间,还需要除以系统节拍数:sysconf(_SC_CLK_TCK)
2、库函数 clock_t clock(void)
这个和times区别是,他没有参数,仅仅为了获取进程时间的。
三,休眠
1、系统调用 int nanosleep(const struct timespec *req, struct timespec *rem)
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
纳秒级时长
req:用于设置休眠时间长度,可精确到纳秒级别。
rem:可设置 NULL,如果休眠被信号打断其回传剩余时间
2、库函数
unsigned int sleep(unsigned int seconds);底层调用nanosleep秒级别休眠,如果被打断返回剩余秒数
int usleep(useconds_t usec);底层调用nanosleep 微秒级别休眠,如果被打断返回剩余微秒