Linux内核 ns_to_timeval()

函数:ns_to_timeval( )

文件包含:

#include<linux/time.h>

函数定义:

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

函数定义格式:

struct timeval ns_to_timeval(const s64 nsec)

函数功能描述:

  • 函数ns_to_timeval( )将参数nsec表示的时间转换成用结构体timeval变量表示的时间,参数的时间单位是纳秒,其中在函数的实现过程中调用了函数ns_to_timespec( )

输入参数说明:

  • 此函数的输入参数是一个64位有符号整数,表示的是时间,单位是纳秒。

返回参数说明:

函数的返回值是struct timeval类型的结构体变量,linux-3.19.3/include/uapi/linux/time.h,其声明如下:

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

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

实例解析:

编写测试文件:ns_to_timeval.c

头文件引用:

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

模块加载函数定义:

int __init ns_to_timeval_init(void)
{
    struct timeval tv;            //声明变量,用于保存函数执行结果
    const s64 nsec=1001000000;    //-1001000000,定义64位有符号整数,作为函数的参数
    printk("ns_to_timeval begin.\n");
    tv=ns_to_timeval(nsec);       //调用函数,将参数表示的时间转换成用timeval表示的时间
    printk("the value of the struct timeval is:\n");
    printk("the tv_sec value is:%ld\n", tv.tv_sec);      //秒数
    printk("the tv_usec value is:%ld\n", tv.tv_usec);    //微秒数
    printk("ns_to_timeval over.\n");
    return 0;
}

模块退出函数定义:

void __exit ns_to_timeval_exit(void)
{
    printk("Goodbye ns_to_timeval\n");
}

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

module_init(ns_to_timeval_init);
module_exit(ns_to_timeval_exit);

实例运行结果及分析:

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

Linux内核 ns_to_timeval()

如果将参数改为-1001000000,重新编译插入运行,出现如图B所示结果。

Linux内核 ns_to_timeval()

结果分析:

  • 从图A和图B可以看出,函数ns_to_timeval( )能将64为有符号整数表示时间转变成结构体timeval变量表示的时间,但其精确度不够,有时间误差。与函数ns_to_timespec( )相比,函数ns_to_timeval( )转换的时间是不准确的,不能精确到纳秒级。对于参数是负数时,函数也能正确转换,但说对内核时间负数是没有意义的。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!