红联Linux门户
Linux帮助

ntpdate更新arm linux开发板时间,100%成功

发布时间:2017-02-18 11:20:07来源:linux网站作者:coding梦想_起点
想通过ntp来更新arm Linux开发板上的时间,下载了最新的ntp-4.2.9(http://www.ntp.org/)结果死活arm-linux-gcc编译不过去,按照网上某人的方法[附],基本上不能成功,包括拿着他这个所使用的版本ntp-4.2.4也是无法成功编译以及运行。
只能arm-linux-gnueabi-gcc编译过去,但是运行的时候出问题,具体表现在getaddrinfo函数执行异常,返回值异常,初步分析,可能是arm-linux-gnueabi-gcc自带的glibc库内部实现的问题,反正我的arm-linux-gnueabi-gcc版本是4.8,对应的gblic版本是2.19的,最新的可能解决了,但是我不能更换编译工具链,因为是在ubuntu14.04上,getaddrinfo出错导致域名无法解析为IP地址,即使更换为IP地址传入ntpdate,也提示Error错误,这一点无法理解。
 
没办法退回到最早时候的ntp-4.2.0版本,然后只编译ntpdate,其他部分不编译,make过程中会把其依赖的其他文件一并做编译,目的想用ntpdate程序更新时间,其他暂时不考虑,注意编译过程中可能出现一些错误之类的,甚至运行的时候也会出现segmentation fault这样的错误,基本上是init_alarm函数内部的部分signal_no_reset出现了问题。
ntpdate程序的原理很多人没说,其实就是添加好对应的服务器列表以后,启动一个定时器,给各个服务器发送ntp数据包,这个数据包貌似有标准格式,没仔细分析,然后服务器收到数据包之后,客户端select之后拿到返回包含时间的数据包,解析并修改系统时间,基本上就是这样,但是ntpdate本身的程序因为要兼容winnt还有vxworks等等各种平台,所以里面超多的#if #else if等等条件编译,严重影响对代码的理解。
 
不得不说,./configure这种探测编译环境的方式有足够多的缺陷,有时候明明目标平台是支持某个特性的,结果它探测完生成的config.h文件就是不支持该特性,就导致后面编译彻底出问题了,比如说我的目标平台以及编译工具链都支持timer_create和timer_settime这种启动定时器的方式,我自己写的别的程序使用了timer_create都正常,结果让ntp自带的./configure配置完了以后生成的config.h就是没有宏HAVE_TIMER_CREATE和HAVA_TIMER_SETTIME,真垃圾。
还有ntp开源的东西,为了在同一个程序里面兼容多种平台,什么winnt、vxworks等等,做了大量的条件编译,真的,如果不是source insight的高亮外加#error做源码编译流程探测,很难理解这些代码,其实想做的事情很简单,就是发包给服务器,那后拿返回数据解析并设置系统时间。
 
不管怎样,总算是把能运行的ntpdate编译出来了,设置了板子上/etc/localtime时区为Shanghai以后,现在运行ntpdate完美可以更新时间了。
网上给了一堆的ntp服务器,也就这个比较好用一些。
#./ntpdate time.buptnet.edu.cn
 
附:
ntpdate更新arm linux开发板时间,100%成功
 
本文永久更新地址:http://www.linuxdiyf.com/linux/28513.html