当前位置: 首页 > article >正文

笔记整理—内核!启动!—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);

http://www.kler.cn/a/321992.html

相关文章:

  • Django 依赖库管理
  • 【计网】从零开始掌握序列化 --- 基础知识储备与程序重构
  • Ubuntu24.04下安装Budgie桌面的注意事项
  • 【C++掌中宝】深入理解函数重载:概念、规则与应用
  • Map和Set,TreeMap和TreeSet,HashMap和HashSet
  • Docker安装和配置MySQL 5.7的完整指南
  • 【Unity与数据库01】开发者如何选择数据库
  • 深度学习:(五)初识神经网络
  • Unity2022.3.x各个版本bug集合及推荐稳定版本
  • 使用jQuery处理Ajax
  • kotlin——设计模式之责任链模式
  • 数据结构之二叉树(1)
  • 本地生活服务项目揭秘!谁搭建的本地生活服务商作业系统收益效果好?
  • 使用ELK Stack进行日志管理和分析:从入门到精通
  • JDK7和JDK8中的HashMap有什么区别?
  • 初学51单片机之I2C总线与E2PROM
  • Java 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)
  • 【小bug】使用 RestTemplate 工具从 JSON 数据反序列化为 Java 对象时报类型转换异常
  • git 清除二进制文件的 changes 状态
  • [笔记]某华AICrane系统全景笔记