Linux内核 timeval_compare()

函数:timeval_compare()

timeval_compare()函数用于比较两个timeval变量表示的时间的大小。

文件包含:

#include<linux/time.h>

函数定义:

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

函数定义格式:

static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
{
    if (lhs->tv_sec < rhs->tv_sec)
        return -1;
    if (lhs->tv_sec > rhs->tv_sec)
        return 1;
    return lhs->tv_usec - rhs->tv_usec;
}

输入参数说明:

  • 函数的两个输入参数都是timeval类型的结构体变量,定义见文件linux-3.19.3/include/uapi/linux/time.h,其声明如下:
struct timeval
{
    __kernel_time_t                tv_sec;         /* 秒数 */
    __kernel_suseconds_t          tv_usec;        /* 微秒数 */
};
  • 此结构体可用于记录时间,其中字段tv_sec的单位是秒(s),用于表示整秒数,字段tv_usec的单位是微秒(ms),表示不足一秒的部分,在此其有效取值范围是0~999999。

返回参数说明:

  • 此函数的返回结果是int型的变量,可能的值是大于0、小于0、等于1,返回结果小于0说明第一个参数表示的时间小于第二个参数表示的时间;返回结果等于0说明两个参数表示的时间相同;返回大于0说明第一个参数表示的时间大于第二个参数表示的时间。

实例解析:

编写测试文件:timeval_compare.c

头文件引用:

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

模块加载函数定义:

int __init timeval_compare_init(void)
{
    // 定义变量,当作函数的第一个参数
    struct timeval lhs=
    {
        .tv_sec=1,
        .tv_usec=1000
    };
    // 定义变量,当作函数的第二个参数
    struct timeval rhs=
    {
        .tv_sec=1,
        .tv_usec=9999
    };
    printk("timeval_compare begin.\n");
    int result=timeval_compare(&lhs, &rhs);        //调用函数,比较两个时间的大小
    printk("the timeval compare result is: %d\n", result);     //显示比较结果
    printk("timeval_compare over.\n");
    return 0;
}

模块退出函数定义:

void __exit timeval_compare_exit(void)
{
    printk("Goodbye   timeval_compare\n");
}

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

module_init(timer_init);
module_exit(timer_exit);

实例运行结果及分析:

执行命令insmod timeval_compare.ko插入模块,然后输入命令dmesg -c,出现如图A所示结果。

Linux内核 timeval_compare()

还有其他两种可能的结果,如图B和图C所示。

Linux内核 timeval_compare()

Linux内核 timeval_compare()

1)两个参数表示的时间相同。如图B所示。

2)第一个参数表示的时间大于第二个参数表示时间。如图C所示。

结果分析:

从图A可以推断函数的第一个参数表示的时间小于第二个参数表示的时间,查看程序验证推断正确。对于图B和图C是此函数调用另外两种可能的运行结果,只需改变参数的大小即可实现。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!