Реентерабельность на FreeBSD

Реентерабельность (reentrant) является характеристикой библиотечных функций, которая позволяет множественным процессам и потокам использовать одно адресное пространство с гарантией того, что данные сохраняемые в этом пространстве останутся неизменными между вызовами функций. Другими словами reentrant функция гарантирует корректное поведение всех одновременно вызванных “копий” этой функции в одном процессе. Это очень важно для многопоточного приложения или при обработке сигнала.

Пример,
char * _not_reentrant () {
       static char buf [...];
       // заполняется буфер
       return buf;
}

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

В стандартной C-библиотеке некоторые функции имеют их реентерабельные версии. Обычной практикой реализации таких функций является наличие окончания “_r“. Например, стандартная функция fopen имеет реентерабельную версию fopen_r. Однако не все стандартные функции имеют их реентерабельные аналоги. Некоторые ОС в своем арсенале имеют безопасные аналоги C-библиотек собранные с реализацией реентерабельных аналогов. На FreeBSD реализована библиотека Reentrant C-функций (libc_r, -lc_r), которая прозрачно замещает стандартные С-функции на их реентерабельные версии. Для применения такой библиотеки потребуется пересобрать приложение, выбрав libc_r библиотеку взамен стандартной libс.

Оставить комментарий

Можно использовать теги: <a href="" rel="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>