笔记整理—内核!启动!—linux应用编程、网络编程部分(5)系统时间与信息
两个时钟名词的概念,GMT为格林尼治时间,以格林尼治时间为全球统一时间。UTC为协调时间,按照市区进行不同地区时间的换算。
对于计算机而言,时间分点时间与段时间。点时间精确到某一时间;段时间顾名思义为一段时间,例如5分钟、1小时等。 定时器,也就是timer,是用于定时段时间的。实时时钟,RTC,与点时间相关。
jiffies为linux系统内的全局变量,用于记录jiffies为单位的时间长度的数值,jiffies是一个节拍时间,调度系统工作时,就会按照这个时间做节拍时间,jiffies记录节拍数。
jiffies开机就有基础数值,当内核每度过一个节拍,则jiffies就会+1,系统时间依照jiffies值进行计算,开机时间=jiffies*节拍时间。
内核开机时就会读取RTC作为基准时间,对应一个jiffies值,当前RTC-1970-01-01 00:00:00+0000作为开机时间的jiffies时间然后系统运行,每个时钟节拍会对时间进行维护。那么当前时间就=当前jiffies+1970-01-01 00:00:00+0000,就是当前时间。
RTC的真正作用是在开关机之间提供正确的时间,系统运行过程中RTC可用不起作用,jiffies是一个段时间。
一个时钟节拍取决于操作系统的配置,一般为10ms或1ms,用HZ表示,1000HZ=1/1000=1ms。
linux时钟以API形式进行调用,又将API加工为库函数进行调用。
time_t time(time_t *t);返回1970年到现在的时间
其他的API多以这个time函数加工而成
gmtime/localtime将time加工为一个结构体struct tm
使用mktime将struct tm转为time。将struct tm转字符串使用asctime/strftime,time_t转衣服穿用ctime。
gettimeofday由timeval(时间)与timezone(时区)两个结构体表示。
settimeofofday用于设置时间与时区
时间API示例
time()
time_t tNow=0;
返回方式有两种
tNow=time(NULL);不以指针方式返回
time(&tNow);以指针方式返回
ctime();
char *ctime(const time_t *timep);
char *tp=ctime(&tNow);
struct tm *gmtime(const time_t *timer)
struct tm tmNow;
memset(&tmNow,0,sizeof(tmNow));
gmtime_r(&tNow,&tmNow);为gmtime的可重入版本结构体为tmNow.tm_year;tmNow.tm_mon;tmNow.tm_day,其余还有时分秒等,都是从1900,UTC0开始进行的计算
localtime()与gmtime()方式一样,只不过加上了时区(UTC+时区)
time_t mktime(struct tm *tm);用于设置系统时间
asctime()与ctime一样
char *asctime(const struct tm *tm);
tp=asctime(&tmNow);
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)支持对format自定义格式设置返回一个*s,大小为max,return返回大小
char buf[100]={0};
memset(buf,0,sizeof(buf));
strftime(buf,sizeof(buf),"%Y-%m-%d,%H-%M-%s",&tmNow);
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval tv;
struct timezone tz;
memset(&tv,0,sizeof(tv));
memset(&tz,0,sizeof(tz));
ret=gettimeofday(&tv,&tz);