加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

浅析Linux中的时间编程和实现原理(二)硬件和GLibC库的细节

发布时间:2016-10-31 01:41:20 所属栏目:Linux 来源:网络整理
导读:引子 熟悉了基本的编程方法之后,我们的兴趣就在于,计算机如何实现这一切的呢?在那些应用层 API 和底层系统硬件之间,操作系统和库函数究竟做了些什么? 首先

time() 的实现

第一个典型 API 是 time(),我们参考 GlibC2.13 版本的实现。

清单 1.time 的 GlibC 实现

time_t time (time_t *t)
{
 INTERNAL_SYSCALL_DECL (err);
 time_t res = INTERNAL_SYSCALL (time, err, 1, NULL);//系统调用
 return res;
}

可以看到,GlibC 的 time() 函数只是调用了 time 系统调用,来返回时间值。同样,如果我们查看 gettimeofday() 等很多 API,将会发现它们也是仅仅调用了 Linux 的系统调用来完成指定的功能。根据我的分析,下面这些函数都是直接调用了 Linux 的系统调用来完成工作:

浅析Linux中的时间编程和实现原理(二)硬件和GLibC库的细节

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/Linux/

ftime() 的实现

ftime() 在 Glibc 中的代码实现在 sysdeps/unix/bsd/ftime.c,因为在 Linux 系统中 ftime 系统调用已经过时了,目前如果还有调用 ftime() 的应用程序 GLibc 将用 gettimeofday() 来模拟,具体代码如下:

清单 2,ftime 的 GlibC 实现

int ftime (timebuf)
 struct timeb *timebuf;
{
 struct timeval tv;
 struct timezone tz;
    
 if (__gettimeofday (&tv, &tz) < 0) //调用 gettimeofday
 return -1;
    
 timebuf->time = tv.tv_sec;
 timebuf->millitm = (tv.tv_usec + 500) / 1000;
 if (timebuf->millitm == 1000) {
 ++timebuf->time;
 timebuf->millitm = 0; }
 timebuf->timezone = tz.tz_minuteswest;
 timebuf->dstflag = tz.tz_dsttime;
 return 0;
}

timer_create() 的实现

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读