C getnameinfo——什么';它在Linux中的系统调用是什么?

C getnameinfo——什么';它在Linux中的系统调用是什么?,c,linux,assembly,linux-kernel,system-calls,C,Linux,Assembly,Linux Kernel,System Calls,有一个函数我怎么知道它的系统调用是什么?Linux系统调用表中没有这样的函数。或者只存在于该C库中?getnameinfo没有直接的系统调用。它是一个库函数,执行许多活动来满足请求。例如,在查找主机名时,它可能会尝试: 查阅本地文件(如/etc/nsswitch.conf和/etc/hosts) 查找其DNS服务器的IP地址(读取/etc/resolv.conf) 使用DNS协议执行套接字写入和读取以请求主机名 如果您正确地使用getnameinfoAPI编写了一个简单的应用程序,那么就可以

有一个函数我怎么知道它的系统调用是什么?Linux系统调用表中没有这样的函数。或者只存在于该C库中?

getnameinfo
没有直接的系统调用。它是一个库函数,执行许多活动来满足请求。例如,在查找主机名时,它可能会尝试:

  • 查阅本地文件(如
    /etc/nsswitch.conf
    /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
...

事实上,它是手册的第3节,这表明它不是一个系统调用。第2节是系统调用,第3节是C库函数。@RossRidge,这是约定吗?第1部分是干什么的?
man
列出了这些部分,第1部分是“可执行程序或shell命令”@TrentP,好的。但为什么这不适用于“男人2”,例如?它不应该打开第2节吗?当您向
man
提供一个参数时,它假定该参数是您想要了解的命令。没有名为
2
的命令。当您提供两个参数时,如果第一个参数是一个数字,它将被视为限制命令搜索的节号,第二个参数是命令。对于汇编应用程序来说,更好的做法是:自己实现它或使用C函数?@kooimo如果有疑问,请使用C函数。我建议您对所有系统调用和非平凡库函数调用libc,以实现更好的可移植性。