系统调用之sys_gettimeofday

  • Post author:
  • Post category:其他


这个函数以timeval 结构体返回当前系统时间和当前的时区
其源码分析如下:
SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
		struct timezone __user *, tz)
{
	#这里用likely修饰可以知道大部分情形下下tv 不为null,所以这里会调用do_gettimeofday 返回时间
	#然后通过copy_to_user 将ktv中的值赋值到用户空间buffer tv中
	
	if (likely(tv != NULL)) {
		struct timeval ktv;
		do_gettimeofday(&ktv);
		if (copy_to_user(tv, &ktv, sizeof(ktv)))
			return -EFAULT;
	}
	#这个函数也可以获取当前的时区信息,但是不常用,kernel中的时区信息是保存在sys_tz这个全局变量中
	if (unlikely(tz != NULL)) {
		if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
			return -EFAULT;
	}
	return 0;
}
获取kernel 时间的函数如下:
void do_gettimeofday(struct timeval *tv)
{
	struct timespec64 now;

	getnstimeofday64(&now);
	tv->tv_sec = now.tv_sec;
	tv->tv_usec = now.tv_nsec/1000;
}



版权声明:本文为tiantao2012原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。