Главная страница  Межпроцессное взаимодействие (состязание) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [ 37 ] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

и src/fs/fs.h, подключаемые при каждой сборке системы. Главные заголовочные файлы каждой из трех составных частей системы служат каждый для своих целей, но начало у всех них одинаковое, оно приведено в листинге 2.12. Главные заголовочные файлы еще будут обсуждаться в этой книге, цель данного обзора - только подчеркнуть, что заголовочные файлы из различных каталогов используются совместно. В этом и следующем разделах мы упомянем каждый из перечисленных в листинге 2.12 файлов.

Листинг 2.12. Начальная часть всех главных заголовочных файлов, подключающая все прочие заголовочные файлы, нужные в коде

#include <minix/config.h> /* Этот файл ДОЛЖЕН включаться первым */ #1nclude <ansi.h> /* Этот файл ДОЛЖЕН включаться вторым */

#include <sys/types.h> #include <minix/const.h> #include <m1nix/type.h> #include <11mits.h> #include <errno.h> #include <minix.syslib.h>

Начнем с первого из файлов в каталоге include/ - ansi.h (строка 0000). Он необходим при компиляции любой из частей системы. Его назначение - удостовериться, что компилятор соответствует требованиям стандарта языка С, который определяется Международной организацией по стандартизации (International Organization for Standards). Этот стандарт также иногда называется ANSI С, поскольку изначально, до международного признания, он разрабатывался Американским национальным институтом стандартов (American National Standard Institute). Соответствующий стандарту компилятор должен определять несколько макросов, пригодных к использованию в компилируемых профаммах. Например, макрос STDC у правильного компилятора должен иметь значение 1,

как если бы последнему была подана строка

#define STDC 1

Сейчас поставляемый с MINIX компилятор удовлетворяет стандарту, но более старые версии были разработаны до его принятия, поэтому MINIX все еще можно скомпилировать классическим компилятором С (Керниган и Ричи). MINIX создавалась как легко переносимая система, и возможность привлекать старые компиляторы - важная составная часть задуманного. Выражение

#define ANSI

на строках 0023 и 0025 обрабатывается в том случае, если применяется стандартный компилятор. В ansi.h определяются несколько различных макросов, причем то, как это делается, зависит от того, определен ли макрос ANSI.

Главный макрос в файле ansi.h - это макрос .PROTOTYPE. Он позволяет записывать прототип функции в таком виде:

РР0Т0ТУРЕ(тип-результата. имя-функции, (тип-аргумента аргумент, ...))

и, если компилятор соответствует стандарту, препроцессор приводит эту запись к следующему виду:

тип-результата иия-функции (тип-аргумента аргумент. ...)



Если же компилятор более старый, макрос транслируется так: тип-результата имя-функции О

Прежде чем переходить от ansi.h к другим файлам, обратим внимание еще на один момент. Все содержимое файла обрамлено строками:

#ifndef ANSI H и

#endi f

Кроме того, сразу после строки с #ifndef ANSI H определяется сам макрос ANSI H. Назначение этой конструкции в том, чтобы убедиться, что заголовочный файл будет включен только один раз. При повторном включении все его содержимое будет проигнорировано. Подобная техника используется во всех файлах из каталога include/.

Второй файл из include/, косвенно включаемый в каждый из файлов с кодами системы, - это limits.h (строка 0100). В нем объявлены основные ограничения, относящиеся к типам языка и системе. Например, число битов в целом числе или максимальная длина имени файла. Все главные заголовочные файлы включают также файл errno.h (строка 0200). Здесь содержатся коды ошибок, возвращаемые пользователю в глобальной переменной еггпо после системных вызовов. Эта переменная также индицирует некоторые внутренние ошибки, например попытку переслать сообщение несуществующему процессу. Причем внутри системы коды ошибок отрицательны, чтобы можно было понять, что это ошибки, а возвращаемое пользователю значение должно быть положительным. Этот эффект достигается с помощью следующего приема: каждый код ошибки определяется специальной строкой вида (строка 0236):

#define EPERM ( SIGN 1)

При компиляции системных файлов в главных заголовочных файлах определяется макрос .SYSTEM, в результате чего SIGN транслируется в - , а при компиляции пользовательских программ SYSTEM никогда не определяется, и SIGN просто игнорируется.

Следующая рассматриваемая группа файлов не включается в главные заголовочные файлы, но тем не менее эти файлы повсеместно используются в коде системы. Главный из них - unistd.h (строка 0400). В нем перечислены константы, требуемые стандартом POSIX. Кроме того, в нем описаны прототипы многих функций, в том числе всех функций для доступа к системным вызовам MINIX. Второй файл - string.h, он содержит прототипы большого количества функций для манипуляции со строками. Файл signaLh (строка 0700) задает стандартные имена сигналов. Кроме того, в нем определены прототипы некоторых функций для работы с сигналами. Как мы позднее увидим, работа с сигналами присуща всем составляющим MINIX.

В fcntLh указываются различные параметры, имеющие значение при управлении файлами. Например, благодаря задаваемым здесь константам для открытия файла в режиме чтения можно указывать макрос 0 RDONLY вместо того, чтобы



напрямую передавать значение 0. Этот файл нужен в основном файловой системе, но он же используется в нескольких местах внутри ядра и менеджера памяти.

Оставшиеся в каталоге include/ файлы требуются не так широко, как ранее упомянутые. Файл stdlib.h содержит описания типов, макросов и прототипов функций, нужные практически всем программам, за исключением самых простых. При создании пользовательских программ это один из наиболее часто используемых файлов, хотя в кодах MINIX он применяется только несколько раз в ядре.

Как мы увидим при рассмотрении уровня задач MINIX в главе 3, консольный и терминальный интерфейсы операционной системы сложны, по причине того что большое количество различного оборудования должно взаимодействовать с пользователем стандартным образом. Для управления устройствами ввода/вывода терминального типа используются константы, макросы и функции, прототипы которых приведены в файле termios.h. Самая главная структура здесь - структура termios. В нее входят различные флаги, управляющие режимами работы, переменные для задания скоростей ввода и вывода данных, а также массив специальных символов, таких как INTR и KILL. Эта структура, как и многие макросы и функции файла termios.h, регламентирована стандартом POSIX.

Тем не менее, каким бы всеобъемлющим ни был стандарт POSIX, он не может включить в себя все, что может понадобиться. Поэтому вторая часть файла, начиная со строки 1241, относится к расширениям POSIX. Некоторые из них вполне очевидны, например определение стандартных скоростей передачи данных (57 600 бод и выше). Подобные расширения не запрещены POSIX, а сам стандарт не может объять необъятное. Но при разработке в MINIX профамм, которые рассчитаны и на перенос в другое окружение, следует избегать специфичных для MINIX определений. Сделать это несложно. Если в файле имеются специфичные для MINIX расширения, то их использование контролируется макрокомандой

#ifdef MINIX

Если макрос MINIX не определен, расширения игнорируются.

Последний файл в каталоге include/, который мы рассмотрим, - a.out.h. Он определяет формат, в котором исполняемые файлы хранятся на диске, включая заголовок файла, нужный для его запуска, и таблицу символов, создаваемую компилятором. Этот заголовочный файл интересен только файловой системе.

Теперь переместимся в подкаталог include/sys/. Как видно из листинга 2.12, все главные заголовочные файлы основных составных частей MINIX включают в себя файл sys/types.h, сразу после ansi.h. В types.h определяются различные типы данных, встречающиеся в MINIX. Благодаря ему можно избежать различных ошибок, связанных с неправильным использованием типов. Размеры некоторых типов данных (в битах) для 16- и 32-разрядных систем указаны в табл. 2.2. Кроме того, обратите внимание, что имена всех типов данных заканчиваются символами * t . Это - больше чем договоренность. Это требование стандарта POSIX. Согласно последнему, окончание .t* является зарезервированным суффиксом



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [ 37 ] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

© 2000 - 2018 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.