• от одной файловой системы к другой. Например, традиционные файловые системы System V позволяют для имени файла задействовать до 14 байт, а традиционные файловые системы BSD и большинство файловых систем, обычно используемых в Linux, допускают имена файлов длиной до 255 байт.

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

• Некоторые ограничения и возможности известны в ходе компиляции. Например, максимальное значение переменной типа int определяется аппаратной архитектурой и деталями реализации компилятора. Эти ограничения могут быть записаны в заголовочных файлах.

• Другие ограничения и возможности могут изменяться в ходе выполнения приложения. Для таких случаев в SUSv3 определяются три функции — sysconf(), pathconf() и fpathconf(). Приложение может вызвать их для проверки ограничений и возможностей данной реализации UNIX.

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

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

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

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

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

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

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

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

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

Перейти на страницу:

Похожие книги