曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 23235|回复: 0
打印 上一主题 下一主题

时间处理函数 | do_gettimeofday() -- 获取当前系统时间

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-9-28 15:49:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
名称: 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 读取时,会减去该初始值的溢出。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 02:16 , Processed in 0.064863 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表