2017-01-19 34 views
2

有一個功能https://linux.die.net/man/3/getnameinfo我如何知道它的系統調用是什麼? Linux系統調用表中沒有這樣的功能。或者只存在於該C庫中?getnameinfo - 它在Linux中的系統調用是什麼?

+5

本手冊的第3部分表明它不是系統調用。第2部分用於系統調用,第3部分用於C庫函數。 –

+0

@RossRidge,這是一個約定嗎?第1部分是什麼? – Kooiomo

+2

'man man'列出了部分,1是「可執行程序或shell命令」 – TrentP

回答

3

getnameinfo沒有直接的系統調用。這是一個庫函數,它執行許多活動來完成請求。例如,查找主機名時,它可能會嘗試:

  • 諮詢本地文件(如​​和/etc/hosts
  • 發現其DNS服務器的IP地址(讀/etc/resolv.conf
  • 執行插座寫和使用DNS協議,要求主機名

如果你寫正確使用getnameinfo API一個簡單的應用程序,然後你可以使用strace工具讀取找出正在使用的系統調用。會有很多額外的信息,但如果你仔細研究它,你會看到相關的呼叫。我的系統上的相關輸出的幾行:

... 
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3 
... 
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 3 
... 
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3 
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("8.8.8.8")}, 16) = 0 
... 
+0

對於程序集應用程序更好:自己實現還是使用C函數? – Kooiomo

+1

@Kooiomo如有疑問,請使用C函數。我建議你爲所有的系統調用和非平凡的庫函數調用libc以獲得更好的可移植性。 – fuz