在项目中实现NTP功能模块时,为了更好的兼容和更小的警告,将gethostbyname函数用getaddrinfo函数进行了替代,但是在开发板上运行时却遇到了这个错误: shell
getaddrinfo fail for host time.windows.com:System error error:No such file or directory然而一样的代码程序在PC上运行是正确的。能够肯定是开发板上的文件系统环境缺乏某个与网络相关的配置文件致使getaddrinfo系统调用执行失败,问题在因而哪个文件,怎么来找到它?答案是使用strace工具在追踪getaddrinfo在PC上执行是的文件访问记录,从而找出缺乏的配置文件。
为了减小干扰,使用一个简单的test程序来进行分析,使用以下命令获得追踪记录: windows
# strace -e trace=file -o 2.strace ./test_getaddrinfo追踪记录文件信息以下(为了保持strace文件的语法高亮,这里使用图片):
滤掉程序执行涉及的动态库连接缓存之类的文件(由于程序运行起来了),就只剩下三个文件了:/etc/host.conf /etc/hosts /etc/resolv.conf. api
/etc/resolv.conf文件是域名解析服务器列表的参数文件,实现域名解析,必须设置域名服务器的地址,开发板上已经配置了。 缓存
/etc/hosts 文件是主机地址列表参数文件,指定本机的ip地址和主机名称,是域名解析的优先参考映射,即先查看该文件,而后才查询DNS,开发板上不存在该文件。 服务器
因而添加该文件到开发板上,经过如下命令: 网络
# echo "127.0.0.1 localhost" > /etc/hosts而后再次运行程序,getaddrinfo解析域名成功,再也不返回System Error的错误。
为了保证getaddrinfo之类接口的正确运行,能够采用二者途径来确保配置环境的OK: 函数
1. 在制做设备的根文件系统时,保证上述配置文件的存在及正确。 工具
2. 在应用程序中检测,若是不存在就建立配置文件。我在NTP的实现中就采用了这一个方法: code
if(access("/etc/hosts",F_OK)) {// create the file for getaddrinfo api system("echo \"127.0.0.1 localhost\" > /etc/hosts"); }