Linux内核API do_gettimeofday

do_gettimeofday函数功能描述:获取当前系统内核时间,此时间是用距离1970:1:1:00:00:00的时间差表示的,表示方法是将时间差存放在结构体变量中,用秒数和微秒数表示,秒数是64位的整数形式,所以有一定的表示范围,如果当前的时间距离1970:1:1:00:00:00太长,结果就可能溢出。

do_gettimeofday文件包含

#include<linux/timekeeping.h>

do_gettimeofday函数定义

在内核源码中的位置:linux-3.19.3/kernel/time/timekeeping.c

函数定义格式:

void do_gettimeofday(struct timeval *tv)

do_gettimeofday输入参数说明

输入的参数是一个结构体变量,定义见文件linux-3.19.3/include/uapi/linux/time.h,用于记录当前系统的时间,其定义如下:

struct timeval
{
    __kernel_time_t                tv_sec;         /*秒数*/
    __kernel_suseconds_t           tv_usec;        /*微秒数*/
};

此结构体可用于记录时间,但不如timespec结构体精准。其中,字段tv_sec的单位是秒,用于表示整秒数,与结构体timespec的tv_sec字段相同;字段tv_usec的单位是微秒(ms),表示不足一秒的部分,在此其取值范围是0~999999。

do_gettimeofday返回参数说明

  • 此函数的返回值是void类型的变量,即不返回任何结果。

do_gettimeofday实例解析

编写测试文件:do_gettimeofday.c

头文件引用:

#include <linux/module.h>
#include<linux/time.h>
MODULE_LICENSE("GPL");

模块加载函数定义:

int __init do_gettimeofday_init(void)
{
    printk("do_gettimeofday test begin.\n");
    struct timeval now=
    {
        .tv_sec=0,
        .tv_usec=0
    };            //声明一个变量
    do_gettimeofday(&now); //调用函数获取时间,此时间是距离1970-01-01 00:00:00的时间
    /*显示当前时间差*/
    printk("the seconds of the day is: %ld\n", now.tv_sec);       //秒数
    printk("the microseconds of the day is: %ld\n", now.tv_usec); //微秒数
    printk("do_gettimeofday test over.\n");
    return 0;
}

模块退出函数定义:

void __exit do_gettimeofday_exit(void)
{
    printk("Goodbye do_gettimeofday test\n");
}

模块加载、退出函数调用:

module_init(do_gettimeofday_init);
module_exit(do_gettimeofday_exit);

实例运行结果及分析:

执行命令insmod do_gettimeofday.ko插入模块,输入命令dmesg -c查看系统输出信息,出现如图所示结果。

Linux内核API do_gettimeofday

结果分析:

输出的结果1449366307是当前时间的秒数部分,363754是当前时间不足一秒的时间部分,是微秒数。为了说明函数的正确性可以将显示的秒数反向粗略地转换成年月日,在1970:1:1的基础上进行验证即可。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API do_gettimeofday
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址