最初の「名前またはサービスが不明」(EAI_NONAME) を取得した場合、getaddrinfo() への次の呼び出しは、最初にキャッシュをチェックするのではなく、dns に直接行くようです (nscd ログはルックアップ試行を示さず、tcpdump は DNS サーバーへのトラフィックを示します) )。最初の呼び出しがアドレスの取得に成功した場合、それ以降、予想どおり、すべての getaddrinfo() 呼び出しは最初に nscd に進みます。
arm Linux の glibc-2.13 に対してコンパイルしています。私の rc.d では、デーモンの前に nscd が開始されます。nscd は、共有キャッシュを禁止し、ホスト キャッシュを維持するように設定されています。busybox (0.47) の nscd を使用しています。nsswitch.conf は、ホストが cache/files/dns をチェックするように設定されています。hosts.conf はファイル/バインドをチェックするように設定されています。
私のデーモンは getaddrinfo() を呼び出しています。
実行中の nscd のデバッグ ログがあり、クライアントが DNS 応答の読み取りを開始し、"Broken Pipe" エラーで終了したことを示しています。
その後、キャッシュを使用しようとする他のデーモンからの GAI の試みが表示されます (したがって、nscd がロックされているなどではないことがわかります)。
デーモンを再起動すると、最初の DNS クエリが再びタイムアウトになると、同じ動作になります。
私のデーモンのキャッシュへのリンクを無効にしている glibc に何かありますか? デーモンを再起動せずにキャッシュに再接続する方法はありますか (resolv.conf を res_init() で強制的に再ロードするのと同様)