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

       想通过ntp来更新arm linux开发板上的时间,下载了最新的ntp-4.2.9结果死活arm-linux-gcc编译不过去,按照网上某人的方法http://blog.csdn.net/zgrjkflmkyc/article/details/45098831 ,基本上不能成功,包括拿着他这个所使用的版本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

你可能感兴趣的:(嵌入式软件,嵌入式硬件)