getnameinfo -- 在 Linux 中它的系统调用是什么?
getnameinfo -- what's syscall for it in Linux?
有一个函数https://linux.die.net/man/3/getnameinfo我怎么知道它的系统调用是什么? Linux 系统调用 table 中没有这样的函数。或者只存在于那个 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
...
有一个函数https://linux.die.net/man/3/getnameinfo我怎么知道它的系统调用是什么? Linux 系统调用 table 中没有这样的函数。或者只存在于那个 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
...