11
кода языка. Это значит, что, при переносе программ языка С на другую операционную платформу, потребуется только новая компиляция исходных текстов программ.
Замечание
Поскольку, стандарт POSIX определяет только интерфейс к системным сервисам, то он оставляет за рамками рассмотрения саму реализацию интерфейса. В частности:
•не различаются системные вызовы и библиотечные функции;
•не являются объектом стандартизации средства администрирования, а также
аппаратные ограничения и функции, которые необходимы только суперпользователю.
Ориентация POSIX на международный стандарт языка C определила также и направление развития спецификаций POSIX, в плане синхронизации обоих стандартов:
•В стандарте проведено разделение на обязательные и дополнительные функции.
•Особое внимание уделяется способам реализации стандартизуемых функ-
ций, как в "классической" Unix-среде, так и на других операционных платформах, в сетевых и распределенных конфигурациях.
Вредакции 2003-го года, стандарт POSIX рассматривает следующие категории системных компонентов:
•средства разработки;
•сетевые средства;
•средства реального времени;
•потоки управления;
•математические интерфейсы;
•пакетные сервисы;
•заголовочные файлы;
•унаследованные интерфейсы.
Именно такой, общий перечень интерфейсов должна предоставлять каждая операционная система для работы любого приложения.
Реализация или операционная система, соответствующая стандарту POSIX, должна поддерживать все обязательные служебные программы, функции, а так-же заголовочные файлы с обеспечением специфицированного в стандарте поведения. Для этих целей используется константа _POSIX_VERSION, которая имеет значение 200112L.
ОС также может предоставлять возможности, помеченные стандартом в качестве дополнительных или содержать нестандартные функции. Если утверждается, что поддерживается некоторое расширение, то это должно производиться
непротиворечивым образом, для всех необходимых частей и так, как описано в стандарте. Для этого, в заголовочном файле <unistd.h> должны быть определены константы, соответствующие всем поддерживаемым необязательным возмож-
12
ностям. Например, константа _POSIX2_C_DEV обслуживает средства разработки программ на языке C.
Анализируя эти константы, во время компиляции, система разработки выяс-нит возможности используемой ОС и подстроится под них.
Аналогичные действия могут быть выполнены с помощью:
• функции long sysconf(int name), - во время выполнения программы;
•служебной программой getconf, - посредством запуска ее в командной строке или в сценарии языка shell.
Подробное изучение функции sysconf(...) выходит за рамки нашего курса, а результат начала вывода утилиты getconf показан на рисунке 1.4.
Рисунок 1.4 — Вывод системных констант утилитой getconf
Для минимизации размеров ОС и приложений, стандартом POSIX была предусмотрена весьма мелкая гранулярность необязательных возможностей. Было проведено объединение взаимосвязанных необязательных возможностей в группы:
•шифрование;
•средства реального времени;
13
•продвинутые средства реального времени;
•потоки реального времени;
•продвинутые потоки реального времени;
•трассировка;
•ПОТОКИ;
•унаследованные возможности.
Вдокументации на ОС должны быть отражены вопросы соответствия стандарту POSIX, описаны поддерживаемые дополнительные и нестандартные возможности.
Применительно непосредственно к ОС, определены ряд основных понятий, соответствующих стандарту POSIX:
•пользователь;
•файл;
•процесс;
•терминал;
•хост;
•узел сети;
•время;
•языково-культурная среда.
Это - первичные понятия, которые строго не определяются, а поясняются с помощью других понятий и отношений. Для каждого из них описаны присущие им атрибуты и применимые к ним операции. Содержатся пояснения следующих основных понятий:
1)У пользователя есть имя и числовой идентификатор.
2)Файл - объект, допускающий чтение и/или запись и имеющий такие атрибуты, как права доступа и тип. К числу последних относятся обычный файл, символьный и блочный специальные файлы, канал, символьная ссылка, сокет и каталог. Реализация может поддерживать и другие типы файлов.
3)Процесс - адресное пространство вместе с выполняемыми в нем потоками управления, а также системными ресурсами, которые этим потокам требуются.
4)Терминал (или терминальное устройство) - символьный специальный файл, подчиняющийся спецификациям общего терминального интерфейса.
5)Сеть - совокупность взаимосвязанных хостов.
6)Языково-культурная среда - часть пользовательского окружения, которая зависит от языковых и культурных соглашений.
Для работы, с большим числом сущностей, предоставляются механизмы группирования и построения иерархий. Существует:
•иерархия файлов;
•группы пользователей и процессов;
•подсети и другие.
Для написания программ, оперирующих с сущностями POSIX-совместимых систем, применяются или командный интерпретатор (языка shell) и/или компилируемый язык C:
• в первом случае, приложение может пользоваться разными служебными прог-
14
раммами (утилитами);
• во втором, - функциями.
Функциональный интерфейс ОС всегда считается первичным, но, в POSIXсовместимых ОС, определены объекты, которые считаются вспомогательными. Такие объекты обеспечивают организацию взаимодействия между основными сущностями. Примерами таких объектов являются средства межпроцессного взаимодействия, которые выполняются в определенном окружении. Частью такого окружения является языково-культурная среда (Locale), которая образованная такими категориями, как:
•символы и их свойства;
•форматы сообщений;
•дата и время;
•числовые и денежные величины.
Каждый процесс ОС ассоциирован, по крайней мере, на три файла:
•стандартный ввод;
•стандартный вывод;
•стандартный протокол.
Обычно, стандартный ввод назначается на клавиатуру терминала, а стандартный вывод и стандартный протокол - на экран:
•со стандартного ввода читаются команды и (иногда) исходные данные для них;
•на стандартный вывод поступают результаты выполнения команд;
•в стандартный протокол помещаются диагностические сообщения.
Замечание
К ОС, также могут предъявляться качественные требования, например, требование поддержки реального времени: способность обеспечить необходимый сервис в течение заданного отрезка времени.
Стандарт POSIX также определяет ряд требований к среде компиляции POSIXсовместимых приложений. Часто, разработка приложений ведется в кросс-режиме. Поэтому на каждой инструментальной платформе создается такая среда компиляции приложений, чтобы результат этой компиляции можно было перенести для последующего выполнения на целевую платформу.
Важнейшая часть среды компиляции - заголовочные (или включаемые) файлы, содержащие прототипы функций, определения символических констант, мак-росов, типов данных, структур и т.п.
Для каждой, описанной в стандарте POSIX функции, определено, где и какие заголовочные файлы должны быть включены использующим ее приложением. Посредством символических констант, определенных в заголовочном файле <unistd.h>, операционная система предоставляет приложению информацию о поддерживаемых возможностях.
15
Стандартом POSIX, также предусмотрен симметричный механизм, называемый механизмом макросов проверки возможностей. Он позволяет приложениям объявлять о своем желании получить доступ к определенным прототипам и именам.
Замечание
Основным требованием к приложениям, которые строго соответствуют стандарту POSIX, является определение символической константы _POSIX_C_SOURCE со значением 200112L, до включения каких-либо заголовочных файлов. Таким обра-зом, POSIXсовместимое приложение заявляет, что ему нужны POSIX-имена. Близкую по смыслу роль играет макрос _XOPEN_SOURCE (со значением 600).
В качестве примера использования макросов может служить следующий фрагмент заголовочного файла:
#if defined(_REENTRANT) || (_POSIX_C_SOURCE - 0 >= 199506L) #define LIBXML_THREAD_ENABLED
#endif
С целью не допустить пересечения имен, в заголовочных файлах используются префиксы posix_, POSIX_ и _POSIX_, которые зарезервированы для нужд стандарта.
Замечание
С подчеркивания, за которым следует еще одно подчеркивание или заглавная латинская буква, могут начинаться только системные, но не прикладные имена.
Для включаемых файлов описаны префиксы используемых в них имен. Например:
•для операций управления файлами, фигурирующих в <fcntl.h>, в качестве префиксов задействованы F_, O_, S_;
•у средств межпроцессного взаимодействия, описанных в файле <sys/ipc.h>, префиксом служит IPC_;
•для манипулирования характеристиками терминалов в файле <termios.h>
определено множество разнообразных имен: EXTB, VDSUSP, DEFECHO, FLUSHO и другие;
•еще имеется четыреста семнадцать имен типа _Exit, abort, abs, acos и дру-
гие, которые могут участвовать в редактировании внешних связей прикладной программы.
Мобильность приложений, соответствующих стандарту POSIX, принципиально достижима благодаря двум основным факторам:
•во-первых, - наличию огромного числа стандартизованных системных сервисов;
•во-вторых, - возможности динамического выяснения характеристик целевой платформы и подстройки под них приложения.