欢迎来到天天文库
浏览记录
ID:39465476
大小:178.50 KB
页数:17页
时间:2019-07-04
《Linux中的时间编程和实现原理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux中的时间编程和实现原理本文试图完整地描述Linux系统中C语言编程中的时间问题。主要内容包括应用程序中的时间编程方法;时钟硬件简介;Glibc时间函数的实现以及Linux内核对时间的支持和实现原理。这一部分,探讨应用开发中的时间编程问题。引子我们都生活在时间中,但却无法去思考它。什么是时间呢?似乎这是一个永远也不能被回答的问题。然而作为一个程序员,在工作中,总有那么几次我必须思考什么是时间。比如,需要知道一段代码运行了多久;要在log文件中记录事件发生时的时间戳;再比如需要一个定时器以便能够定期做某些计算机操作。我发现,在计算机世界中,
2、时间在不同场合也往往有不同的含义,让试图思考它的人感到迷茫。但值得庆幸的是,Linux中的时间终究是可以理解的。因此我打算讨论一下有关时间的话题,尝试着深入理解Linux系统中C语言编程中的时间问题。主要内容如下:·第1部分是应用程序中的时间问题。有三个方面:程序计时需要;获取当前时间;定时器。·第2部分包括时间硬件简介和GlibC实现时间函数的原理。·第3和第4部分是Linux内核对时间的支持和实现原理。现在开始第1部分,探讨应用开发中的时间编程问题。在这一部分中,所有的例子代码都在GlibC2.14,内核2.6.33的Linux系统下编译并验
3、证执行过。读者如果使用低版本的GlibC和Linux内核有可能无法正确执行。获取当前时间时间的获取在程序当中,我们经常要输出系统当前的时间,比如日志文件中的每一个事件都要记录其产生时间。在C语言中获取当前时间的方法有以下几种,它们所获得的时间精度从秒级到纳秒,各有所不同。表1.C时间函数function定义含义返回值精度time()time函数获得从1970年1月1日0点到当前的秒数,存储在time_t结构之中。time_t秒gettimeofday()gettimeofday函数返回从1970年1月1日0点以来,到现在的时间。用timeval数
4、据结构表示。structtimeval{time_ttv_sec;longinttv_usec;};微秒clock_gettime()clock_gettime函数返回从1970年1月1日0点以来,到现在的时间。用timespec数据结构表示。支持不广泛。属于实时扩展。structtimespec{time_ttv_sec;longinttv_nsec;};纳秒ftime()函数返回从1970年1月1日0点以来,到现在的时间。用timeb数据结构表示。已经过时,被time()替代。尽量不使用。structtimeb{time_ttime;unsi
5、gnedshortmillitm;shorttimezone;shortdstflag;};毫秒GUN/Linux提供了三个标准的API用来获取当前时间,time()/gettimeofday()/clock_gettime(),它们的区别仅在于获取的时间精度不同,您可以根据需要选取合适的调用。ftime()是老的一些系统中的时间调用,很多Linux版本虽然支持它,但仅仅是为了向前兼容性,新开发的软件不建议使用ftime()来获得当前时间。时间显示和转换目前我们得到的时间是一个数字,无论精度如何,它代表的仅是一个差值。比如精度为秒的time()函
6、数,返回一个time_t类型的整数。假设当前时间为2011年12月7日下午20点29分51秒,那么time_t的值为:1323318591。即距离1970年1月1日零点,我们已经过去了1323318591秒。(这里的1970年1月1日零点是格林威治时间,而不是北京时间。)我们下面讨论的时间如果不特别说明都是格林威治时间,也叫GMT时间,或者UTC时间。字符串“1323318591秒”对于多数人都没有太大的意义,我们更愿意看到“2011年12月7日”这样的显示。因此当我们得到秒,毫秒,甚至纳秒表示的当前时间之后,往往需要将这些数字转换为人们所熟悉的
7、时间表示方法。由于国家,习惯和时区的不同,时间的表示方法并没有一个统一的格式。为了满足各种时间显示的需求,标准C库提供了许多时间格式转换的函数。这些函数的数量众多,容易让人迷惑,记住它们的用法十分不易。在这里我借用MichaelKerrisk在《LinuxProgrammingInterface》一书中的插图,来对这些标准C函数进行一个总体的概览。图1.各种时间显示格式转换函数关系图从上图可以看到,time()/gettimeofday()从内核得到当前时间之后,该当前时间值可以被两大类函数转换为更加容易阅读的显示格式:·固定格式转换·用户指定格
8、式转换函数。固定格式转换用ctime()函数转换出来的时间格式是系统固定的,调用者无法改动,因此被称为固定格式转换。如果您对日期格式没有
此文档下载收益归作者所有