Опрос конфигурационных параметров хоста
Значения конфигурационных параметров – важнейшая характеристика хоста, а настройка на конфигурацию целевой системы – обязательный элемент мобильного программирования приложений. Подобная настройка может выполняться статически, средствами условной компиляции, а также динамически, путем опроса значений конфигурационных параметров во время выполнения.
Основная часть статической конфигурационной информации сосредоточена в упоминавшемся ранее заголовочном файле <unistd.h>. Кратко опишем наиболее важные характеристики.
_POSIX_VERSION
Поддерживаемая версия системного интерфейса для языка C стандарта POSIX. Для POSIX-2001 значение этой константы должно равняться 200112L. Предыдущей версии (1996 года) соответствует значение 199506L.
_POSIX2_VERSION
Поддерживаемая версия интерфейса к системным сервисам на уровне командного языка и служебных программ; для реализаций, соответствующих стандарту POSIX-2001, значение этой константы должно равняться 200112L.
В листинге 10.4 показан пример использования значения _POSIX_VERSION для условной компиляции.
#if _POSIX_VERSION >= 200112L /* Используем новую функцию, применимую к */ /* большим файлам */ off_t fpos = ftello (fp); #else /* Либо реализация поддерживает только */ /* старую версию стандарта POSIX, либо */ /* константа _POSIX_VERSION вообще не */ /* определена. */ /* Используем старую, традиционную функцию */ /* опроса текущей позиции в файле */ long fpos = ftell (fp); #endif
Листинг 10.4. Пример условной компиляции с использованием конфигурационной константы _POSIX_VERSION. (html, txt)
Следующая группа констант описывает поддерживаемые необязательные возможности стандарта POSIX-2001. Значения этих констант могут равняться -1 (необязательная возможность не поддерживается), 0 (в системе присутствуют все необходимые описания, но наличие поддержки нужно опросить во время выполнения) или быть положительными (возможность полностью поддерживается реализацией).
_POSIX_CHOWN_RESTRICTED
Функции chown() и fchown() могут вызываться для смены владельца только процессами, обладающими соответствующими привилегиями.
_POSIX_IPV6
Реализация поддерживает IPv6. Положительное значение этой константы должно равняться 200112L.
_POSIX_JOB_CONTROL
Реализация поддерживает управление заданиями.
_POSIX_NO_TRUNC
Компоненты маршрутных имен, имеющие длину более NAME_MAX, вызывают сообщения об ошибках.
_POSIX_REGEXP
Реализация поддерживает обработку регулярных выражений.
_POSIX_SAVED_IDS
Каждый процесс имеет сохраненный ПДП-идентификатор и сохраненный ПДГ-идентификатор.
_POSIX_SHELL
Реализация поддерживает стандартный командный интерпретатор.
_POSIX_VDISABLE
Значением этой константы должен быть символ, отключающий обработку соответствующего специального управляющего символа терминала, если его (символ _POSIX_VDISABLE) сделать значением элемента массива c_cc[].
_POSIX2_C_BIND
Реализация поддерживает системный интерфейс для языка C. Значение этой константы должно равняться 200112L.
_POSIX2_CHAR_TERM
Реализация поддерживает по крайней мере один тип терминалов.
_POSIX2_LOCALEDEF
Реализация поддерживает создание языково-культурных сред. Положительное значение должно равняться 200112L.
_POSIX_V6_ILP32_OFF32
Реализация предоставляет среду компиляции C-программ с 32-битными типами int, long, off_t и такими же указателями.
_POSIX_V6_ILP32_OFFBIG
Реализация предоставляет среду компиляции C-программ с 32-битными типами int, long и такими же указателями; размер значений типа off_t составляет не менее 64 бит.
_POSIX_V6_LP64_OFF64
Реализация предоставляет среду компиляции C-программ с 32-битным типом int и 64-битными указателями и типами long и off_t.
_POSIX_V6_LPBIG_OFFBIG
Реализация предоставляет среду компиляции C-программ с не менее чем 32-битными значениями типа int и не менее чем 64-битными указателями и значениями типов long и off_t.
_POSIX_ASYNC_IO
Поддерживается асинхронный ввод/вывод.
_POSIX_PRIO_IO
Поддерживается приоритетный ввод/вывод.
_POSIX_SYNC_IO
Поддерживается синхронизированный ввод/вывод.
Три константы задают номера файловых дескрипторов для стандартных ввода (STDIN_FILENO со значением 0), вывода (STDOUT_FILENO – 1) и протокола (STDERR_FILENO – 2).Их нужно не анализировать, а использовать вместо явных числовых значений.