1. Linux系统时间
jiffies是linux内核中的一个全局变量,用来记录以内核的节拍时间为单位时间长度的一个数值。
jiffies变量开机时有一个基准值,然后内核每过一个节拍时间jiffies就会加1。 一个时间节拍的时间取决于操作系统的配置,Linux系统一般是10ms或者1ms。这个时间其实就是调度时间,在内核中用HZ来记录和表示。如果HZ定义成1000难么时钟节拍就是1/HZ,也就是1ms。
内核在开机启动的时候会读取RTC硬件获取一个时间作为初始基准时间,这个基准时间对应一个jiffies值(这个基准时间换算成jiffies值的方法是:用这个时间减去1970-01-0100:00:00+0000(UTC),然后把这个时间段换算成jiffies数值),这个jiffies值作为我们开机时的基准jiffies值存在。然后系统运行时每个时钟节拍的末尾都会给jiffies这个全局变量加1,因此操作系统就使用jiffies这个全局变量记录了下来当前的时间。当我们需要当前时间点时,就用jiffies这个时间点去计算(计算方法就是先把这个jiffies值对应的时间段算出来,然后加上1970-01-0100:00:00+0000(UTC)即可得到这个时间点)因此,操作系统只在开机时读一次RTC,整个系统运行过程中RTC是无作用的。RTC的真正作用其实是在OS的2次开机之间进行时间的保存。
2. Linux系统时间API
time
当前时间距离1970-01-0100:00:00+0000(UTC)的多少秒。(time内部就是用jiffies换算得到的秒数。)
gmtime / localtime
- 把time得到的秒数变成一个struct tm结构体表示的时间。gmtime得到的是国际时间,而localtime得到的是本地时间(计算机所设置的时区对应的本地时间)。
mktime
用来完成相反方向的转换(struct tm到time_t)
asctime strftime
从struct tm出发得到字符串格式的时间。
ctime
从time_t出发得到字符串格式的时间。
#include <stdio.h>
#include <time.h>int main() {time_t current_time;current_time = time(NULL);if (current_time < 0){perror("time");exit(-1);}printf("Current time: %ld\n", current_time);printf("%s\n",ctime(¤t_time));return 0;
}