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
所示结果。
然后系统的时间发生变化,如图B
所示。
如果将更改的时间参数tv的字段tv_nsec更改为1000000000,然后重新编译,加载模块,输入命令dmesg -c,出现如图C
所示结果。
如果将更改的时间参数tv的字段tv_sec和字段tv_nesc都更改为0,然后重新编译,加载模块,输入命令dmesg -c,出现如图D
所示结果。
此时系统的时间发生改变,如图E
所示。
结果分析:
从输出的结果可以看出函数do_settimeofday( )能够完成更改系统内核时间的作用,但机器重启之后此更改会无效,系统会恢复其正确时间。
对于图E
的结果,系统的时间变为1970年1月1日8时1分,而没有变为1970:1:1:00:00:00,因为时差的问题,由于系统所属时区是北京时区,与本初子午线所处时区正好相差8个时区,所以结果会与预料的结果不同。