getaddrinfo函數返回No such file or directory的分析

在項目中實現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");
    }
相關文章
相關標籤/搜索