名称: 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 读取时,会减去该初始值的溢出。 |