阅读了《Unix/Linux系统编程》中关于定时器及时钟服务的部分,结合网上资料进行了整理
1. 相关概念
基于X86架构的个人计算机有数个定时器,包括实时时钟RTC、可编程间隔定时器PIT、多核CPU中的本地定时器、高分辨率定时器。
实时时钟RTC
:RTC由一个小型备用电池供电,即使计算机关机时,它也能够连续运行。RTC用于实时提供时间和日期信息。由于RTC在电脑关机时继续运行,因此可以解释为什么开机后系统显示的时间与现实中保持一致。时间变量是一个长整数,即从1970年1月1日起经过的秒数。
2. 时钟相关系统调用与库函数
2.1 gettimeofday系统调用
返回当前时间即当前秒数和微秒数。其中秒数是相对于1970年1月1日0点所经过的秒数。
int gettimeofday(struct timeval * tv, struct timezone * tz)
-
参数tv指向一个timeval结构体变量,该变量保存返回的时间结果。
timeval结构体定义如下:tv_sec成员保存秒数,tv_usec成员保存微秒数
struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ };
-
第二个参数类型timezone已过期,使用NULL即可。
2.2 settimeofday系统调用
设置系统时间
int settimeofday(const struct timeval *tv, const struct timezone *tz)
- 第一个参数tv即为要设置的系统时间
- 第二个参数类型timezone已过期,使用NULL即可
2.3 ctime库函数
以日历形式显示当前日期和时间。
char * ctime(const time_t * timer)
- 参数是指向 time_t 变量的指针,该变量即为从1970年开始的秒数。
- 返回值是一个C字符串,该字符串以日历形式表示当前日期和时间。
示例:获取当前时间并以日历形式显示
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
int main(){
struct timeval t;
gettimeofday(&t,NULL);//获取当前系统时间
printf("cur time is : %s",ctime(&t.tv_sec));//以日历形式打印当前时间
}
运行结果
xtark@xtark-vmpc:~/桌面/linux_study/section5$ gcc test.c
xtark@xtark-vmpc:~/桌面/linux_study/section5$ ./a.out
cur