Почему inet_ntoa предназначена для не реентерабельной функции? - PullRequest
7 голосов
/ 10 ноября 2009

Взглянув на исходный код библиотеки GNU C, я обнаружил, что inet_ntoa реализован с помощью

static __thread char buffer[18]

Мой вопрос таков: поскольку существует необходимость использовать reeentrant inet_ntoa, почему автор библиотеки GNU C не использует malloc для его реализации?

спасибо.

1 Ответ

17 голосов
/ 10 ноября 2009

Причина, по которой он не использует кучу, - это соответствие стандартам (POSIX) и другим системам. Интерфейс просто не такой, что вы должны освободить возвращенный буфер. Предполагается статическое хранилище ..

Но, объявив его как локальный поток (с __thread), два потока не конфликтуют друг с другом, если они оба вызывают функцию. Это обходной путь от glibc к нарушению интерфейса.

Это правда, что это не повторный вход или не соответствует духу этого термина. Если у вас есть рекурсивная функция, которая вызывает ее, вы не можете полагаться на одинаковый буфер между вызовами. Но он может использоваться несколькими потоками, что часто достаточно.

РЕДАКТИРОВАТЬ: Кстати, я только что вспомнил, есть более новая версия этой функции, которая использует предоставленный вызывающим буфером. См inet_ntop().

...