如果我得到一个初始的"名称或服务未知"(EAI_NONAME),下一次调用getaddrinfo()似乎直接转到dns而不是先检查缓存(nscd日志显示没有查找尝试,tcpdump显示流量到DNS服务器).如果第一次调用成功获取地址,从那时起,所有getaddrinfo()调用首先转到nscd,如预期的那样.
我正在针对arm linux编译glibc-2.13.在我的rc.d中,nscd在我的守护进程之前启动.nscd设置为禁止共享缓存,并维护主机缓存.我正在使用busybox中的nscd(0.47).设置了nsswitch.conf,以便主机检查cache/files/dns.hosts.conf设置为check files/bind.
我的守护进程正在调用getaddrinfo().
我有运行nscd的调试日志,它们显示客户端开始读取DNS响应关闭时出现"Broken Pipe"错误.
之后它会显示其他守护进程试图使用缓存的GAI尝试(所以我知道它不是nscd锁定或任何东西),但是获得EAI_NONAME的守护进程再也不会联系nscd进行缓存查找.
如果我重新启动守护程序,如果第一个DNS查询再次超时,我会得到相同的行为.
glibc中有什么东西使我的守护进程到缓存的链接无效吗?有没有办法将我的守护进程重新连接到缓存而不重新启动它(类似于通过res_init()强制resolv.conf重新加载)?