Linux内核API do_settimeofday

do_settimeofday函数功能描述:此函数用于设定系统的内核时间,把系统的内核时间设定为参数ts表示的时间,参数ts表示的时间是距离1970:1:1:00:00:00的秒数。

do_settimeofday文件包含

#include<linux/timekeeping.h>

do_settimeofday函数定义

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

函数定义格式:

static inline int do_settimeofday(const struct timespec *ts)
{
    return do_settimeofday64(ts);
}

do_settimeofday输入参数说明

输入的参数是一个结构体变量,定义见文件linux-3.19.3/include/uapi/linux/time.h,其定义如下:

struct timespec
{
        __kernel_time_t             tv_sec;         /* 秒数 */
        long                        tv_nsec;        /* 纳秒数 */
};

字段tv_sec表示秒数,字段tv_nsec表示纳秒数,表示不足一秒的时间部分,在此字段tv_nsec的取值范围是0~999999999,此参数表示想设定的内核时间。

do_settimeofday返回参数说明

  • 此函数的返回值类型是整型,返回0说明设定时间成功,否则说明设定时间失败。

do_settimeofday实例解析

编写测试文件:do_settimeofday.c

头文件引用:

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

模块加载函数定义:

int __init do_settimeofday_init(void)
{
    printk("do_settimeofday test begin.\n");

    // 声明变量,用于表示想设定的时间
    struct timespec now=
        {
            .tv_sec=111111111,
            .tv_nsec=999999999
    };
    int result=do_settimeofday(&now);         //调用函数更改系统内核时间
    if(result==0)                             //更该时间成功
    {
        struct timespec new_now=
        {
            .tv_sec=0,
            .tv_nsec=0
        };
        getnstimeofday(&new_now);             //获取更改之后的系统内核时间
        printk("set time of the day success, the result is:\n");

        // 显示更改之后的系统内核时间,秒数
        printk("the new seconds of the day is:%ld\n", new_now.tv_sec);
        printk("the new nanoseconds of the day is:%ld\n", new_now.tv_nsec);
                                              //微秒数
    }
    else                                      //更改时间失败
        printk("set time of the day failed! \n");
    printk("do_settimeofday test over.\n");
    return 0;
}

模块退出函数定义:

void __exit do_settimeofday_exit(void)
{
    printk("Goodbye do_settimeofday test\n");
}

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

module_init(do_settimeofday_init);
module_exit(do_settimeofday_exit);

实例运行结果及分析:

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

Linux内核API do_settimeofday

然后系统的时间发生变化,如图B所示。

Linux内核API do_settimeofday

如果将更改的时间参数tv的字段tv_nsec更改为1000000000,然后重新编译,加载模块,输入命令dmesg -c,出现如图C所示结果。

Linux内核API do_settimeofday

如果将更改的时间参数tv的字段tv_sec和字段tv_nesc都更改为0,然后重新编译,加载模块,输入命令dmesg -c,出现如图D所示结果。

Linux内核API do_settimeofday

此时系统的时间发生改变,如图E所示。

Linux内核API do_settimeofday

结果分析:

从输出的结果可以看出函数do_settimeofday( )能够完成更改系统内核时间的作用,但机器重启之后此更改会无效,系统会恢复其正确时间。

对于图E的结果,系统的时间变为1970年1月1日8时1分,而没有变为1970:1:1:00:00:00,因为时差的问题,由于系统所属时区是北京时区,与本初子午线所处时区正好相差8个时区,所以结果会与预料的结果不同。

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

评论 抢沙发

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