+ -
当前位置:首页 → 问答吧 → 编写内核日志文件,请问linux内核中有没有现成是时间函数可以调用?

编写内核日志文件,请问linux内核中有没有现成是时间函数可以调用?

时间:2010-11-22

来源:互联网

大家好:
  我现在编写一个小的防火墙程序,只是想把防火墙命中的数据包给记录下来,
可是记录的时候,需要用到时间,不知道linux下有没有时间函数可以直接调用。
看过一些资料,说linux下只产生从1970.01.01到现在的以秒为单位的时间,是不是真的啊

作者: wuwenhua   发布时间: 2010-11-22



QUOTE:
  我现在编写一个小的防火墙程序,只是想把防火墙命中的数据包给记录下来,
可是记录的时候,需要用到时间,不知道linux下有没有时间函数可以直接调用。


本来调用 printk 输出到系统日志的时候,系统日志会包含一个时间的。
如果你对时间精度要求不是很高,可以考虑用这个。



QUOTE:
看过一些资料,说linux下只产生从1970.01.01到现在的以秒为单位的时间,是不是真的啊


内核态有个 do_gettimeofday 函数,可以返回自1970.01.01 到现在的 秒和微妙。

如果需要转换为年月日的话,应该是需要自己写代码实现。

作者: Godbach   发布时间: 2010-11-22

哦,我想用比较精确的时间。
比如 2010-11-22  10:25:30,如果这样的话,就必须自己写代码
通过秒来计算年,月,日。实现时间函数了吗?

作者: wuwenhua   发布时间: 2010-11-22

你看看这个函数,是可以的把时间给取出来吗?
/* 根据秒数获得本地 日期的简单程序
*        用查表的方法来计算
*        2007年到2012年的时间
* 参数: r:时间结构,用于将计算结果传出
*/
void   Localtime(struct tm *r, unsigned long time)
{
        unsigned int year, i, days, sec;
        __u16 *yday = NULL;
        /* 2007年到2012年与1970年的天数 */
        __u16 days_since_epoch[] =
        {
                /* 2007 - 2012 */
                13514,13879, 14245, 14610,14975, 15340,
        };

        /*某月在一年中开始的天数*/
        __u16 days_since_year[] = {
                0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
        };
        /*某月在一个润年中开始的天数*/
        __u16 days_since_leapyear[] = {
                0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335,
        };
        yday = days_since_year;                        /*假设为一般年*/

        sec = time + 3600*8;                        /*加上东八区的秒数*/
        days = sec /(3600*24);                        /*整天数*/
        sec =  sec % (3600*24);                        /*一天内秒数*/
        r->hour = sec / 3600;                        /*小时数*/
        sec = sec % 3600;                                /*一小时内秒数*/
        r->min = sec / 60;                                /*分钟数*/
        r->sec = sec % 60;                                /*一分钟内秒数*/

        /*查表计算1970开始的年数*/
        for(i= 0, year = 2007; days_since_epoch[i]<days; i++,year++);
        year--;i--;                                /*回复正确的数值*/
       
        days -= days_since_epoch[i];                        /*年内天数*/
       
        if (year% 4 == 0 && (year % 100 != 0 || year % 400 == 0))
        {
                yday = days_since_leapyear;                /*闰年*/
        }
       
        for (i=0; i < 12 && days > yday[i]; i++)        /*查找月份*/        ;
        r->year = year;                                        /*年数*/
        r->mon    = i ;                                /*月数*/
        r->mday = days -yday[i-1];                        /*月中日期*/
       
        return ;
}

作者: wuwenhua   发布时间: 2010-11-22

回复 wuwenhua


    看你的意思是要绝对时间?你可以看一下内核源码kernel/time.c这个文件,里面是内核的时间处理,另外参考一下uld3的第5章时间处理部分。

作者: kgn28   发布时间: 2010-11-22

好的 啊   等会 我看看kernel/time.c这个文件
谢谢啊

作者: wuwenhua   发布时间: 2010-11-22

回复 wuwenhua


    恩,直接使用xtime变量貌似也是可以的,这个是墙上时间。

作者: kgn28   发布时间: 2010-11-22



QUOTE:
哦,我想用比较精确的时间。
比如 2010-11-22  10:25:30,如果这样的话,就必须自己写代码
通过秒来计算年,月,日。实现时间函数了吗?


以前在 2.4 上做过这样的事情,应该是需要自己实现

作者: Godbach   发布时间: 2010-11-22