Вперед Назад Содержание

8. Повторная Входимость

Повторная входимость - это характеристика библиотечных функций, которые позволяют разным задачам использовать одно и тоже адресное пространство, в котором хранящиеся величины не изменяются между вызовами. В реализации библиотеки функций Cygnus C во всех возможных ситуациях обеспечивается повторная входимость функций. Тем не менее, есть несколько функций, повторную входимость которых осуществить нетривиально. Некоторые приемы были применены, чтобы эти функции полностью обладали свойством повторной входимости.

Эти приемы используют структуру _reent, определенную в reent.h. Переменная, определенная как struct _reent называется "структурой, содержащей информацию для обеспечения повторной входимости". Все функции, которые должны изменять глобальные переменные, доступны в двух версиях. Первая версия имеет обычное имя и использует один глобальный вариант структуры, содержащей информацию для обеспечения повторной входимости. Второй имеет другое имя, обычно отличающееся добавлением _ в начале и _r в конце, и берущий указатель на отдельную структуру, содержащую информацию для обеспечения повторной входимости.

Например, функция fopen имеет два аргумента, file и mode, и использует глобальную структуру, содержащую информацию для обеспечения повторной входимости. Функция _fopen_r имеет дополнительный аргумент Struct_reent, который является указателем на отдельную структуру, содержащую информацию для обеспечения повторной входимости.

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

Это означает, что возможны два способа реализации повторного вхождения. Оба требуют от каждой нити исполнения инициализировать уникальную глобальную переменную типа struct _reent:

  1. Использование повтоpно входимой веpсии библиотеки функций после инициализации глобальной структуры, содержащей информацию для обеспечения повторной входимости для каждого пpоцесса. Указатель на этy стpyктypy использyется как дополнительный аpгyмент для всех библиотечных функций.
  2. Сделать так, чтобы каждая нить исполнения имела указатель на свою уникальную структуру, содержащую информацию для обеспечения повторной входимости в глобальную переменную _impure_ptr, и вызывать стандартные библиотечные процедуры.

Следующие функции имеют как повторно-входимые, так и обычные версии.

Эквивалент для переменной 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


Вперед Назад Содержание