Повторная входимость - это характеристика библиотечных функций, которые позволяют разным задачам использовать одно и тоже адресное пространство, в котором хранящиеся величины не изменяются между вызовами. В реализации библиотеки функций Cygnus C во всех возможных ситуациях обеспечивается повторная входимость функций. Тем не менее, есть несколько функций, повторную входимость которых осуществить нетривиально. Некоторые приемы были применены, чтобы эти функции полностью обладали свойством повторной входимости.
Эти приемы используют структуру _reent, определенную в reent.h. Переменная, определенная как struct _reent называется "структурой, содержащей информацию для обеспечения повторной входимости". Все функции, которые должны изменять глобальные переменные, доступны в двух версиях. Первая версия имеет обычное имя и использует один глобальный вариант структуры, содержащей информацию для обеспечения повторной входимости. Второй имеет другое имя, обычно отличающееся добавлением _ в начале и _r в конце, и берущий указатель на отдельную структуру, содержащую информацию для обеспечения повторной входимости.
Например, функция fopen имеет два аргумента, file и mode, и использует глобальную структуру, содержащую информацию для обеспечения повторной входимости. Функция _fopen_r имеет дополнительный аргумент Struct_reent, который является указателем на отдельную структуру, содержащую информацию для обеспечения повторной входимости.
Каждая функция, использующая глобальную структуру, содержащую информацию для обеспечения повторной входимости, использует глобальную переменную _impure_ptr, которая указывает на структуру, содержащую информацию для обеспечения повторной входимости.
Это означает, что возможны два способа реализации повторного вхождения. Оба требуют от каждой нити исполнения инициализировать уникальную глобальную переменную типа struct _reent:
Следующие функции имеют как повторно-входимые, так и обычные версии.
Эквивалент для переменной errno:
_errno_r
Функции локала
_localeconv_r _setlocale_r
Эквиваленты для переменных stdio:
_stdin_r _stdout_r _stderr_r
Функции stdio:
_fdopen_r _mkstemp_r _remove_r
_fopen_r _mktemp_r _rename_r
_getchar_r _perror_r _tempnam_r
_gets_r _putchar_r _tmpnam_r
_iprintf_r _puts_r _tmpfile_r
Сигнальные функции:
_raise_r _signal_r
Функции stdlib:
_dtoa_r _realloc_r _strtoul_r
_free_r _srand_r _system_r
_malloc_r _strtod_r
_rand_r _strtol_r
Функции string:
_strtok_r
Функции system:
_close_r _lseek_r _stat_r
_fork_r _open_r _unlink_r
_fstat_r _read_r _wait_r
_link_r _sbrk_r _write_r
Функции time:
_asctime_r