6.2.1. Обязательные типы POSIX
POSIX описывает некоторые определения типов в заголовочном файле , которые используются для многих аргументов и возвращаемых значений. Эти определения типов важны, потому что стандартные типы языка С могут быть разными на различных машинах, так как они нестрого определены в стандарте С. Из-за такого нестрогого определения язык С полезен на широком диапазоне оборудования — размер слов на 16-разрядных машинах отличается от такового на 64-разрядных машинах, а язык программирования низкого уровня не должен скрывать эту разницу — но для POSIX требуется большая гарантия. От заголовочного файла библиотеки С требуется определение набора соответствующих типов для каждой машины, которая поддерживает POSIX. Каждый из этих определений типов можно легко отличить от собственного типа С, поскольку он заканчивается на _t
.
Ниже описано подмножество, используемое для интерфейсов.
dev_t |
Арифметический тип данных, содержащий старшие (major) и младшие (minor) числа, соответствующие специальным файлам устройств, обычно расположенным в подкаталоге /dev . В Linux dev_t можно манипулировать с помощью макросов major() , minor() и makedev() , которые определены в . Обычно dev_t используется только в системном программировании, описанном в главе 11. |
uid_t , gid_t |
Целочисленные типы, содержащие уникальные идентификаторы, соответственно, пользователя и группы. Удостоверения идентификаторов пользователя и группы рассматриваются в главе 10. |
pid_t |
Целочисленный тип, обеспечивающий уникальное значение для системного процесса (описан в главе 10). |
id_t |
Целочисленный тип, способный хранить без усечения любой тип pid_t , uid_t или gid_t . |
off_t |
Целочисленный тип со знаком для измерения размера файла в байтах. |
size_t |
Целочисленный тип без знака для измерения размеров объектов в памяти, например, символьных строк, массивов или буферов. |
ssize_t |
Целочисленный тип со знаком для подсчета байтов (положительные значения) или хранения кода возврата ошибки (отрицательные значения). |
time_t |
Целочисленный тип (во всех обычных системах) или тип с плавающей точкой (позволяет рассматривать VMS как операционную систему POSIX), выдающий время в секундах, как описано в главе 18. |
Типы намеренно описаны нечетко. Нет никакой гарантии, что типы будут одинаковыми на двух разных платформах Linux или даже в двух различных средах, работающих на одной и той же платформе. Скорее всего, 64-разрядная машина, поддерживающая как 64-разрядную, так и 32-разрядную среды, будет иметь разные значения для некоторых из этих типов в каждой среде.
Кроме того, в будущих версиях Linux представленные типы могут изменяться в рамках, установленных стандартом POSIX.
6.2.2. Раскрытие возможностей времени выполнения
Многие системные возможности имеют ограничения, другие являются необязательными, а некоторые могут содержать связанную с ними информацию. Ограничение на длину строки аргументов, передаваемых новой программе, защищает систему от произвольных запросов памяти, которые в ряде случаев могут вызвать крах системы. Не во всех системах POSIX реализовано управление заданиями. Любая программа может получить сведения о наиболее поздней версии стандарта POSIX, которая реализована в системе.
Функция sysconf()
выдает такой тип системной информации, которая для одного и того же исполняемого файла в различных системах может отличаться и которую невозможно узнать во время компиляции.
#include
long sysconf (int);
Целочисленный аргумент в sysconf()
— это один из наборов макросов с префиксом _SC_
. Ниже перечислены макросы, которые используются чаще всего.
_SC_CLK_TCK |
Возвращает количество тактов в секунду внутренних часов ядра, различаемое программами. Следует отметить, что ядро может содержать одни или больше часов, работающих на более высокой частоте. _SC_CLK_TCK обеспечивает подсчет тактов, которые используются для получения информации из ядра, и этот макрос не является индикатором времени ожидания системы. |
_SC_STREAM_MAX |
Возвращает максимальное количество стандартных потоков ввода-вывода С, которые могут быть одновременно открыты в системе. |
_SC_ARG_MAX |
Возвращает максимальную длину аргумента командной строки и переменных окружения в байтах, которые используются любой из функций exec() . Если это ограничение превышено, exec() вернет ошибку Е2ВIG . |
_SC_OPEN_MAX |
Возвращает максимальное количество файлов, которые одновременно могут быть открыты процессом; это то же самое, что и программное ограничение RLIMIT_NOFILE , которое может быть запрошено функцией getrlimit() и установлено функцией setrlimit() . Это единственное значение sysconf() , которое может изменяться во время выполнения программы; при вызове setrlimit() для изменения ограничения RLIMIT_NOFILE . _SC_OPEN_MAX также подчиняется новому программному ограничению. |
_SC_PAGESIZE или _SC_PAGE_SIZE |
Возвращает размер одной страницы в байтах. В системах, которые могут поддерживать разные размеры страниц, возвращается размер одной обычной страницы, для которой выделено определенное количество памяти и которая считается естественным размером страниц для конкретной системы. |
_SC_LINE_MAX |
Возвращает максимальную длину в байтах входной строки, обрабатываемой текстовыми утилитами, включая завершающий символ новой строки. Следует отметить, что во многих утилитах GNU, используемых в Linux-системах, фактически нет жестко закодированной максимальной длины строки, потому могут применяться входные строки произвольной длины. Однако переносимая программа не должна вызывать текстовые утилиты для строк, длина которых превышает _SC_LINE_MAX ; во многих Unix-системах утилиты работают с фиксированным максимальным размером строки, и его превышение может привести к неопределенным результатам. |
_SC_NGROUPS_MAX |
Возвращает количество дополнительных групп (см. главу 10), которые может иметь процесс. |
6.2.3. Поиск и настройка базовой системной информации
Читать дальше