Linux源码中的mktime算法解析
我们知道,从CMOS中读出来的系统时间并不是time_t类型,而是类似于struct tm那样,年月日时分秒是分开存储的。
那么,要把它转化为系统便于处理的time_t类型,就需要算法进行转换。
我们都知道我们的公历还是比较复杂的,有大月小月,有闰年非闰年,处理起来会很麻烦。
但是Linux的源代码仅仅用了短短的几行就完成了这个复杂的转换(Gauss算法),实在令人惊奇。话不多说,先看源代码:
include/linux/time.h
static
inline
unsigned
long
mktime
(
unsigned
int
year,
unsigned
int
mon,
unsigned
int
day,
unsigned
int
hour,
unsigned
int
min
,
unsigned
int
sec)
{
if
(
0 >
=
(
int
)
(
mon -
=
2)
)
{
/**/
/* 1..12 -> 11,12,1..10 */
mon +
=
12;
/**/
/* Puts Feb last since it has leap day */
year -
=
1;
}
return
(
(
(
(
unsigned
long
)
(
year/
4 -
year/
100 +
year/
400 +
367*
mon/
12 +
day)
+
year*
365 -
719499
)
*
24 +
hour /**/
/* now have hours */
)
*
60 +
min
/**/
/* now have minutes */
)
*
60 +
sec;
/**/
/* finally seconds */
}
看上去令人眼花缭乱,毫无头绪。下面就让我们对该算法作具体的分析。
先不看前面的,直接看return那句,该式整体上具有这样的结构:
T = ((X * 24 + hour) * 60 + min) * 60 + sec
这说明该算法是先算出从1970年1月1日开始的天数X,再进而求出具体的时间值T的。
 
相关文档:
在一个程序崩溃时,默认情况下是不产生core文件。
下面的命令可以检查生成core文件的选项是否打开:
$ulimit -a该命令将显示所有的用户定制,其中选项-a代表“all”。
$ulimit -c unlimited来让特定的用户可以产生core文件
core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。如果您根本就不想 ......
from:http://blog.chinaunix.net/u2/62281/showart_1096746.html
sock_raw原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket
1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包
2.socket(PF_PACK ......
在Solaris上面工作有几个不方便地方:
一个是ls不能按照文件类型显示颜色;
另一个是VI也不能显现语法色彩;
这里就来说明如何解决这两个问题:
其实这两个问题都是Solaris自身所带的ls和vi版本的问题;
所以解决办法就是下载最新的ls和vim源文件包重新编译进行安装,看上去好像挺麻烦,其实就几步,很简单的:
最新的ls是在 ......
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
-->
Linux
世界很精彩,令人眼花缭乱。近期以来,各种轻型
Linux
版本不断登台亮相,知名的
Puppy
(小狗之名)便是一例。何故?
......