浅析 Linux 中的时间编程和实现原理[转]
引子
我们都生活在时间中,但却无法去思考它。什么是时间呢?似乎这是一个永远也不能被回答的问题。然而作为一个程序员,在工作中,总有那么几次我必须思考什么是时间。比如,需要知道一段代码运行了多久;要在 log 文件中记录事件发生时的时间戳;再比如需要一个定时器以便能够定期做某些计算机操作。我发现,在计算机世界中,时间在不同场合也往往有不同的含义,让试图思考它的人感到迷茫。但值得庆幸的是,Linux 中的时间终究是可以理解的。因此我打算讨论一下有关时间的话题,尝试着深入理解 Linux 系统中 C 语言编程中的时间问题。主要内容如下:
- 第 1 部分是应用程序中的时间问题。有三个方面:程序计时需要;获取当前时间;定时器。
- 第 2 部分包括时间硬件简介和 GlibC 实现时间函数的原理。
- 第 3 和第 4 部分是 Linux 内核对时间的支持和实现原理。
现在开始第 1 部分,探讨应用开发中的时间编程问题。在这一部分中,所有的例子代码都在 GlibC 2.14,内核 2.6.33 的 Linux 系统下编译并验证执行过。读者如果使用低版本的 GlibC 和 Linux 内核有可能无法正确执行。
获取当前时间
时间的获取
在程序当中, 我们经常要输出系统当前的时间,比如日志文件中的每一个事件都要记录其产生时间。在 C 语言中获取当前时间的方法有以下几种,它们所获得的时间精度从秒级到纳秒,各有所不同。
表 1. C 时间函数
function 定义 | 含义 | 返回值 | 精度 |
---|---|---|---|
time() | time 函数获得从 1970 年 1 月 1 日 0 点到当前的秒数,存储在_time_t_结构之中。 | time_t ... |