浅析 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 ...
more ...

Markdown中使用MathJax引擎显示数学公式

在工作中,我们经常会用到一些数学公式,如何把这些数学公式显示在文章中,可以利用Markdown+MathJax完成在文章中显示各种数学公式。
Markdown的语法网上有很多,这里就不做重述。
MathJax是一款运行在浏览器中的开源的数学符号渲染引擎,使用MathJax可以方便的在浏览器中显示数学公式,不需要使用图片。可以解析LaTex、MathML和ASCIIMathMl的标记语言。

参考资料

MathJax官网: https://www.mathjax.org/
MathJax源码: https://github.com/mathjax/
MathJax使用说明
Latex在线编辑器: http://latex.codecogs.com/eqneditor/editor.php

使用方法

规则

显示方式分为两种,一种是行内,写在\...\内;另一种是行间,写在$$...$$
Tips: 我试了下在markdown中写在$$...$$只能在一行中显示,需要在多行时显示,可以放在<div>...</div>之间。

步骤

在文档头部加入

 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
 </script>

可以把MathJax下载到本地: git clone git://github.com/mathjax/MathJax.git,然后把src连接转换到本地地址。

然后可以使用Latex在线编辑器进行数学公式编写,然后把结果复制到markdown中即可

行间 $$x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}$$ 行内 \(x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}\)

行间 $$\lim_{n \rightarrow ...

more ...

利用libnet进行TCP会话劫持

会话劫持(Session Hijack): 就是结合了嗅探以及欺骗技术在内的攻击手段。例如,在一次正常的会话过程当中,攻击者作为第三方参与到其中,他可以在正常数据包中插入恶意数据,也可以在双方的会话当中进行监听,甚至可以是代替某一方主机接管会话。

more ...