【问题标题】:getnameinfo -- what's syscall for it in Linux?getnameinfo——Linux 中的系统调用是什么?
【发布时间】:2017-06-03 18:57:18
【问题描述】:

有一个函数https://linux.die.net/man/3/getnameinfo 我怎么知道它的系统调用是什么? Linux 系统调用表中没有这样的函数。还是只存在于那个 C 库中?

【问题讨论】:

  • 手册第 3 节这一事实表明它不是系统调用。第 2 部分用于系统调用,第 3 部分用于 C 库函数。
  • @RossRidge,这是约定吗?第 1 节是干什么用的?
  • man man 列出部分,1 是“可执行程序或shell 命令”
  • @TrentP,好的。但是,例如,为什么这对“man 2”不起作用?它不应该打开第 2 节吗?
  • 当您向man 提供一个参数时,它假定该参数是您想要了解的命令。没有名为2 的命令。当你提供两个参数时,如果第一个参数是一个数字,它被认为是限制命令搜索的节号,第二个参数是命令。

标签: c linux assembly linux-kernel system-calls


【解决方案1】:

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
...

【讨论】:

  • 对于汇编应用来说,什么更好:自己实现还是使用 C 函数?
  • @Kooiomo 如有疑问,请使用 C 函数。我建议您为所有系统调用和重要的库函数调用 libc,以获得更好的可移植性。
猜你喜欢
  • 2016-06-08
  • 2013-08-04
  • 2012-05-04
  • 2020-08-17
  • 1970-01-01
  • 2015-05-24
  • 2020-05-24
  • 2012-10-05
  • 2012-06-30
相关资源
最近更新 更多