曲径通幽论坛

标题: 时间处理函数 | do_gettimeofday() -- 获取当前系统时间 [打印本页]

作者: beyes    时间: 2009-9-28 15:49
标题: 时间处理函数 | do_gettimeofday() -- 获取当前系统时间
名称: do_gettimeofday()

原型
#include <linux/time.h>

void do_gettimeofday (struct timeval *tv)


说明

变量 tv 以秒和微妙表示当前系统时间,tv 指定获取当前系统时间的结构体变量地址。

struct timeval 结构体
struct timeval {
     time_t              tv_sec;
     suseconds_t   tv_usec;      // 1/1,000,000
};

struct timeval 为设定时间或获取时间时使用的结构体,tv_sec 变量把当前时间换算为秒,tv_usec 值指定或获取 tv_usec 无法表示的 us 单位经过的时间。

示例代码
[C++] 纯文本查看 复制代码
#include <linux/config.h> 
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/time.h>
#include <linux/timer.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/types.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <asm/hardirq.h>
int jit_currentime (char *buf, char **start, off_t offset, int len, int *eof, void *data)
{
        struct timeval tv1;
        struct timespec tv2;
        unsigned long j1;
        u64 j2;
        j1 = jiffies;
        j2 = get_jiffies_64();
        do_gettimeofday(&tv1);
        tv2 = current_kernel_time();
        len = 0;
        len += sprintf(buf, "0x%08lx 0x%016Lx %10i.%06i\n %40i.%09i\n",
                        j1, j2, (int)tv1.tv_sec, (int)tv1.tv_usec,
                                (int)tv2.tv_sec, (int)tv2.tv_nsec);
        *start = buf;
        return len;
}
int __init jit_init(void)
{
        create_proc_read_entry("currentime", 0, NULL, jit_currentime, NULL);
        return 0;
}

void __exit jit_cleanup(void)
{
        remove_proc_entry("currentime", NULL);
}

module_init (jit_init);
module_exit (jit_cleanup);

上面内核模块在插入后,会在 /proc 下生成 currentime ,读取它可以获得相应的时间:

[root@centos jit]# head -8 /proc/currentime
0x0006af63 0x000000010006af63 1304826850.644809
                               1304826850.6412052659
0x0006af63 0x000000010006af63 1304826850.644816
                               1304826850.6412052659
0x0006af63 0x000000010006af63 1304826850.644819
                               1304826850.6412052659
0x0006af63 0x000000010006af63 1304826850.644823
                               1304826850.6412052659

在上面的输出中,可以看到 64 位的 jiffies 计数器的高 32 位的最低位被置一,这是由于 INITIAL_JIFFIES 所导致,INITIAL_JIFFIES 的定义为:
[C++] 纯文本查看 复制代码
#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))

该值在系统引导后的 5 分钟就会发生低 32 位字溢出。如果对 /proc/uptime 读取时,会减去该初始值的溢出。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2