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

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


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

Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости