Выбрать главу

Когда константа определена со значением 0, приложение в ходе своего выполнения для проверки поддержки возможности может использовать функции sysconf() и pathconf() (или fpathconf()). Аргумент name, передаваемый этим функциям, обычно имеет такую же форму, как и соответствующая константа времени компиляции, но с префиксом, замененным на _SC_ или _PC_. Реализация должна предоставить как минимум заголовочные файлы, константы и интерфейсы функций, необходимые для проверки в ходе выполнения программы.

В SUSv3 непонятно, что именно означает неопределенная константа: то же, что и определенная константа со значением 0 («возможность может поддерживаться») или же константа со значением –1 («возможность не поддерживается»). Комитет по стандартам впоследствии решил, что этот случай должен означать то же самое, что и конкретная константа со значением –1, и в SUSv4 это четко определено.

В табл. 11.3 приводится список некоторых возможностей, указанных в SUSv3. В первом столбце для возможности дается название связанной с ней константы времени компиляции (определенной в <unistd.h>), а также соответствующие имена для аргументов функции sysconf() (_SC_*) или pathconf() (_PC_*). Обратите внимание на следующие примечания по поводу некоторых возможностей.

• Некоторые возможности указаны в SUSv3 как обязательные, то есть константа времени компиляции всегда устанавливается в значение больше нуля. В прежние времена эти возможности фактически были необязательными, но теперь это не так. Эти возможности в столбце примечания помечены символом «плюс» (+). (Будучи необязательными в SUSv3, некоторые свойства стали обязательными в SUSv4.)

Несмотря на то что эти возможности указаны в SUSv3 как обязательные, в отдельных системах UNIX они все равно могут быть установлены в не соответствующей стандарту конфигурации. Поэтому для портируемых приложений лучше, наверное, будет проверить, поддерживается ли возможность, влияющая на работоспособность приложения, независимо от того, что стандарт требует ее обязательной поддержки.

• Для некоторых возможностей константа времени компиляции может иметь значение, отличное от –1. Иными словами, либо возможность должна поддерживаться, либо ее поддержка в ходе выполнения программы должна быть доступна для проверки. Эти возможности в столбце примечания помечены звездочкой (*).

Таблица 11.3. Отдельные возможности, определенные в SUSv3

Название возможности (константы) (имя для sysconf() или pathconf()) — Описание — Примечание

_POSIX_ASYNCHRONOUS_IO (_SC_ASYNCHRONOUS_IO) — Асинхронный ввод/вывод -

_POSIX_CHOWN_RESTRICTED (_PC_CHOWN_RESTRICTED) — Только привилегированные процессы могут применять chown() и fchown() для изменения пользовательского и группового идентификатора файла на произвольные значения (см. подраздел 15.3.2) — *

_POSIX_JOB_CONTROL (_SC_JOB_CONTROL) — Управление заданиями (см. раздел 34.7) — +

_POSIX_MESSAGE_PASSING (_SC_MESSAGE_PASSING) — Очереди сообщений POSIX (см. главу 48) -

_POSIX_PRIORITY_SCHEDULING (_SC_PRIORITY_SCHEDULING) — Диспетчеризация процессов (см. раздел 35.3) —

_POSIX_REALTIME_SIGNALS (_SC_REALTIME_SIGNALS) — Расширение сигналов реального времени (см. раздел 22.8) -

_POSIX_SAVED_IDS (не определено) — У процесса есть сохраненные установленные идентификаторы пользователей (saved set-user-ID) и сохраненные установленные идентификаторы групп (saved set-group-ID) (см. раздел 9.4) — +

_POSIX_SEMAPHORES (_SC_SEMAPHORES) — Семафоры POSIX (см. главу 49) —

_POSIX_SHARED_MEMORY_OBJECTS (_SC_SHARED_MEMORY_OBJECTS) — Объекты совместно используемой памяти POSIX (см. главу 50) —

_POSIX_THREADS (_SC_THREADS) — Потоки POSIX —

_XOPEN_UNIX (_SC_XOPEN_UNIX) — Поддержка XSI-расширения (см. подраздел 1.3.4) -

11.6. Резюме

В SUSv3 указываются ограничения, которые могут накладываться реализацией, и системные возможности, которые реализация может поддерживать.

Зачастую желательно не задавать жестко в коде программы предположения насчет системных ограничений и возможностей, поскольку от реализации к реализации, а также в отдельно взятой реализации они могут варьироваться: либо во время выполнения программы, либо между файловыми системами. В результате в SUSv3 указываются методы, при использовании которых реализация может извещать об установленных ограничениях и поддерживаемых возможностях. Для большинства ограничений в SUSv3 указываются минимальные значения, которые должны поддерживаться всеми реализациями. Кроме того, каждая реализация может известить о свойственных ей ограничениях и возможностях в ходе компиляции (через константы, определенные в заголовочных файлах <limits.h> или <unistd.h>) и (или) в ходе выполнения программы (через вызов sysconf(), pathconf() или fpathconf()). Эти методы также можно использовать, чтобы выяснить, какие возможности, указанные в SUSv3, поддерживаются реализацией. В некоторых случаях возможность определить конкретное ограничение с помощью любого из этих методов может и не представиться. Тогда, чтобы установить ограничение, которого должно придерживаться приложение, следует прибегать к специальным методам.