
- •Часть первая. Введение в операционную систему Linux
- •Глава 1. Обзор возможностей операционной системы Linux 1
- •Глава 2. Стандартизация unix-подобных операционных систем 23
- •Глава 1. Обзор возможностей операционной системы Linux
- •1.1. Введение
- •1.2. Краткая история Linux
- •1.3. Архитектура unix-подобных операционных систем
- •1.4. Введение в архитектуру ядра unix-подобных операционных систем
- •1.5. Справочная подсистема (man)
- •1.6. Файлы и каталоги
- •1.7. Ввод и вывод
- •1.8. Программы и процессы
- •1.9. Обработка ошибок
- •1.10. Вход в систему и идентификация пользователя
- •1.11. Сигналы
- •1.12. Интерпретатор shell
- •1.12.1. Сокращенное имя файла
- •1.12.2. Переключение ввода-вывода
- •1.12.3. Программные каналы
- •1.12.4. Создание среды
- •1.13. Системные вызовы и библиотечные функции
- •1.14. Выводы по главе 1
- •1.15. Упражнения по главе 1
- •Глава 2. Стандартизация unix-подобных операционных систем
- •2.1. Введение
- •2.2. Стандарты unix
- •2.2.1. Iso c
- •2.2.2. Ieee Posix
- •2.2.3. Single unix Specification
- •2.3. Пределы
- •2.4. Функции sysconf, pathconf и fpathconf
- •2.5. Элементарные системные типы данных
- •2.6. Выводы по главе 2
- •2.7. Упражнения по главе 2
2.3. Пределы
Реализации определяют множество системных констант. Многие из них жестко зашиты в тексты программ, для получения значений других используются специальные методы. Благодаря стандартизации сейчас преобладают более универсальные методы определения значений констант и предусматриваемых реализациями пределов, что очень помогает в разработке переносимого программного обеспечения.
Существует три типа пределов:
Пределы времени компиляции (например, наибольшее значение, которое может принимать переменная типа short int).
Пределы времени выполнения, не связанные с файлами или каталогами (например, максимальная длина имени пользователя). Для получения значений пределов этого типа предусмотрена функция sysconf.
Пределы времени выполнения, связанные с файлами или каталогами (например, максимальная длина имени файла). Для получения значений пределов этого типа предусмотрены функции pathconf и fpathconf.
Пределы времени компиляции чаще всего определяются в заголовочных файлах, которые включаются в программу на этапе компиляции. Пределы времени выполнения требуют, чтобы процесс получил их значения, вызвав соответствующие функции.
Кроме того, некоторые пределы для одной реализации имеют фиксированные значения и потому могут определяться в заголовочных файлах. Для других реализаций они могут варьироваться, вследствие чего для получения их значений требуется обращение к соответствующим функциям во времени исполнения. Примером предела такого типа может служить максимальная длина имени файла. System V до появления SVR4 ограничивала длину имени файла 14 символами, тогда как BSD-системы увеличили это значение до 255 символов. Сегодня большинство реализаций Unix поддерживают множество различных типов файловых систем, и каждая из них имеет собственные пределы – это случай предела времени выполнения, который зависит от того, в какой файловой системе находится рассматриваемый файл. Например, корневая файловая система может ограничивать длину имени файла 14 символами, тогда как в другой файловой системе это ограничение может составлять 255 символов.
2.4. Функции sysconf, pathconf и fpathconf
На этапе выполнения значения пределов можно получить с помощью одной из следующих функций.
#include <unistd.h>
long sysconf (int name);
long pathconf (const char *pathname, int name);
long fpathconf (int filedes, int name);
/* все три функции возвращают значение соответствующего
предела в случае успеха, -1 – в случае ошибки */
Различие между двумя последними функциями состоит в том, что первая из них получает в качестве аргумента строку пути к файлу, а вторая – файловый дескриптор. Имена пределов (аргумент name), значения которых можно узнать, перечислены в справочном руководстве по данным функциям.
Мы должны поближе рассмотреть значения, возвращаемые этими тремя функциями.
Все три функции возвращают значение –1 и код ошибки EINVAL в переменной errno, если аргумент name содержит имя неподдерживаемого предела.
Для некоторых пределов могут возвращаться либо определенные неотрицательные значения, либо признак неопределенности – в этом случае возвращаемое значение равно –1, но при этом значение errno не изменяется.