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