basename_r/dirname_r в Linux

Некоторые функции POSIX не являются потокобезопасными. Примерами являются имя каталога и путь.

Функция dirname() не требует повторного входа. Функция, не требующая повторного входа, не обязана быть потокобезопасной.

На некоторых платформах существуют реентерабельные версии имени каталога и пути: имя_каталога_r и путь_r. Насколько я узнал, в Linux нет реентерабельной версии имени каталога и пути.

  • Это правильно?
  • Какова альтернатива?

person dmeister    schedule 09.09.2010    source источник
comment
Не стесняйтесь принимать любые ответы, если они были вам полезны, даже если это означает бросать кости.   -  person rafl    schedule 02.10.2010
comment
Ты прав. Я просто забыл об этом.   -  person dmeister    schedule 02.10.2010


Ответы (2)


Мне неизвестны реентерабельные версии dirname и basename в Linux.

Однако существуют различные реентерабельные реализации обеих функций в разных нестандартных библиотеках.

g_path_get_dirname и g_path_get_basename из glib, вероятно, широко используются, и их реализация не слишком зависит от остальная часть библиотеки glib тоже, поэтому было бы достаточно просто позаимствовать их реализацию, если вам не особенно хочется связываться с glib.

person rafl    schedule 09.09.2010

Это правильно?

Согласно справочной странице, да.

Какова альтернатива?

Сделайте его потокобезопасным самостоятельно, т.е. оберните вызовы в функцию, которая защищает базовое имя/имя каталога и копирует результат в предоставленный буфер, удерживая мьютекс.

person nos    schedule 09.09.2010