Когда стандартного набора макросов недостаточно, обычно определяют макрос _GNU_SOURCE
(включает все — самое простое решение), _XOPEN_SOURCE=600
(наиболее вероятно, что пригодится поднабор _GNU_SOURCE
) или _ISOC99_SOURCE
(использование функций наиболее позднего стандарта С, поднабор _XOPEN_SOURCE=600
).
6.2. Интерфейсы POSIX
6.2.1. Обязательные типы POSIX
POSIX описывает некоторые определения типов в заголовочном файле <sys/types.h>
, которые используются для многих аргументов и возвращаемых значений. Эти определения типов важны, потому что стандартные типы языка С могут быть разными на различных машинах, так как они нестрого определены в стандарте С. Из-за такого нестрогого определения язык С полезен на широком диапазоне оборудования — размер слов на 16-разрядных машинах отличается от такового на 64-разрядных машинах, а язык программирования низкого уровня не должен скрывать эту разницу — но для POSIX требуется большая гарантия. От заголовочного файла библиотеки С <sys/types.h>
требуется определение набора соответствующих типов для каждой машины, которая поддерживает POSIX. Каждый из этих определений типов можно легко отличить от собственного типа С, поскольку он заканчивается на _t
.
Ниже описано подмножество, используемое для интерфейсов.
dev_t |
Арифметический тип данных, содержащий старшие (major) и младшие (minor) числа, соответствующие специальным файлам устройств, обычно расположенным в подкаталоге /dev . В Linux dev_t можно манипулировать с помощью макросов major() , minor() и makedev() , которые определены в <sys/sysmacros.h> . Обычно 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, которая реализована в системе.