Реентерабельность (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с.

Нет комментариев

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *