は、私はINET_NTOAは、GNU Cライブラリの利用の作者をしない理由reeentrant INET_NTOAを、使用する必要があるので、なぜinet_ntoaはリエントラントでない関数として設計されていますか? GNU Cライブラリのソースコードをちらっと見
static __thread char buffer[18]
私の質問があるとimplementatedされましたそれを実装するmalloc?
ありがとうございました。
は、私はINET_NTOAは、GNU Cライブラリの利用の作者をしない理由reeentrant INET_NTOAを、使用する必要があるので、なぜinet_ntoaはリエントラントでない関数として設計されていますか? GNU Cライブラリのソースコードをちらっと見
static __thread char buffer[18]
私の質問があるとimplementatedされましたそれを実装するmalloc?
ありがとうございました。
ヒープを使用していない理由は、標準(POSIX)と他のシステムに準拠するためです。インタフェースは、返されたバッファを解放するはずのものではありません。
しかし、スレッドローカル(__thread
)と宣言することによって、2つのスレッドが両方とも関数を呼び出す場合、2つのスレッドは互いに競合しません。これはglibcのインタフェースの破損に対する回避策です。
これはリエントラントではなく、その用語の精神と一致していることは間違いありません。あなたがそれを呼び出す再帰的な関数を持っているならば、呼び出しの間に同じであるバッファに頼ることはできません。しかし、それは複数のスレッドで使用することができます。これはしばしば十分です。
編集:ところで、私はちょうど思い出しましたが、この関数の新しいバージョンでは、呼び出し元提供のバッファを使用しています。 inet_ntop()
を参照してください。
@asveikau:申し訳ありませんが、印刷エラーです。 – Jichao
@asveikau:結論として、その互換性については? – Jichao
@jcyangはい、互換性のためです。 – asveikau