Почему функция inet_ntoa не допускает повторного входа?

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

static __thread char buffer[18]

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

Спасибо.


person Jichao    schedule 10.11.2009    source источник


Ответы (1)


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

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

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

EDIT: Кстати, я только что вспомнил, что есть более новая версия этой функции, которая использует буфер, предоставленный вызывающей стороной. См. inet_ntop().

person asveikau    schedule 10.11.2009
comment
@asveikau: В заключение, это для совместимости? - person Jichao; 10.11.2009
comment
@jcyang Да, это для совместимости. - person asveikau; 10.11.2009