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

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

11.1. Системные ограничения

Для каждого определяемого ограничения в SUSv3 требуется, чтобы все реализации поддерживали его минимальное значение. В большинстве случаев такое значение определяется в виде константы в <limits.h> с именем, префиксом для которого служит строка _POSIX_ и в котором (обычно) содержится строка _MAX. То есть имя имеет вид _POSIX_XXX_MAX.

Если приложение ограничивает себя минимальными значениями, указанными в SUSv3, оно будет портируемым для всех реализаций стандарта. Но это не дает ему права воспользоваться преимуществами реализаций, предоставляющих более высокие ограничения. Поэтому зачастую предпочтительнее определять ограничения конкретной системы через <limits.h>, sysconf() или pathconf().

Применение строки _MAX в названиях ограничений, определенных в SUSv3, может показаться странным, учитывая их описание как минимальных значений. Смысл названий проясняется, если заметить, что каждая из этих констант устанавливает верхний предел ресурсов или возможностей, и стандарты определяют, что этот верхний предел должен иметь конкретное минимальное значение.

Иногда в качестве ограничения предоставляются максимальные значения, в именах которых присутствует строка _MIN. Для этих констант верно обратное утверждение: они представляют нижний предел какого-либо ресурса, и стандарты говорят, что в соответствующей реализации этот нижний предел не может быть больше определенного значения. Например, ограничение FLT_MIN (1E–37) задает наибольшее значение, которое реализация может установить для наименьшего числа с плавающей точкой из тех, что могут быть представлены, и все соответствующие стандарту реализации будут иметь возможность для представления чисел с плавающей точкой, по крайней мере таких же малых, как это.

У каждого ограничения есть свое название, которое соответствует показанному выше названию минимального значения, но без префикса _POSIX_. В файле <limits.h> реализаций может быть определена константа с таким именем, служащая признаком соответствующего ограничения для конкретной реализации. Если ограничение определено, то оно всегда будет по крайней мере того же размера, что и рассмотренное выше минимальное значение (то есть XXX_MAX >= _POSIX_XXX_MAX).

Указываемые в SUSv3 ограничения разбиты на три категории: значения, не изменяемые динамически (runtime), изменяемые значения путевых имен и значения, которые могут увеличиваться динамически. Далее эти категории будут рассмотрены на примерах.

Значения, не изменяемые динамически (возможно, неопределенные)

Не изменяемое динамически значение является ограничением, чье значение, если оно определено в <limits.h>, зафиксировано для реализации. Но значение может быть неопределенным (возможно, по причине его зависимости от доступного пространства памяти), в силу чего его может не быть в файле <limits.h>. В таком случае (и даже если ограничение задано в <limits.h>) приложение для определения значения в ходе своего выполнения может воспользоваться функцией sysconf().

Примером такого не изменяемого динамически ограничения может быть MQ_PRIO_MAX. Как отмечается в разделе 48.5.1, это ограничение приоритетов для сообщений в очереди сообщений POSIX. В SUSv3 определена константа _POSIX_MQ_PRIO_MAX со значением 32, которое служит в качестве минимального значения и должно предоставляться для этого ограничения всеми соответствующими реализациями. Иными словами, мы можем быть уверены, что все соответствующие реализации позволят использовать для сообщений приоритеты от 0 и как минимум до 31. Реализация UNIX может установить и более высокое ограничение, определив в <limits.h> константу MQ_PRIO_MAX с его значением. Например, в Linux константа MQ_PRIO_MAX определена со значением 32768. Оно также может быть определено во время выполнения программы с помощью такого вызова:

lim = sysconf(_SC_MQ_PRIO_MAX);

Изменяемые значения путевых имен

Изменяемые значения путевых имен — это ограничения, относящиеся к путевым именам (файлов, каталогов, терминалов и т. д.). Каждое ограничение может быть константой для отдельно взятой реализации или может изменяться от одной файловой системы к другой. В тех случаях, когда ограничение может изменяться в зависимости от путевого имени, приложение способно определить его значение с помощью функции pathconf() или fpathconf().