Главная страница  Взаимодействие нетривиальных процессов 

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

При описании XDR и поддерживаемых типов данных следует уточнить три момента

1. Как объявляются переменные различных типов в файле спецификации RPC (файл с расширением . х)? В наших примерах пока что использовалось только длинное целое.

2. В какой тип языка С преобразуется данный тип программой rpcgen при составлении заголовочного файла?

3. Каков реальный формат передаваемых данных?

Таблица 16.2 содержит ответы на первых два вопроса. Для составления этой таблицы мы создали файл спецификации RPC со всеми поддерживаемыми стандартом XDR типами. Этот файл был обработан rpcgen, после чего мы иззд1или получившийся заголовочный файл.

Таблица 16.2. Типы данных, поддерживаемые XDR и rpcgen

№ Файл спецификации RPC (.х)

Заголовочный файл языка С (.h)

Г - . const name = value

2 typedef declaration;

3 char var; short var; int var; long var; hyper var;

4 unsigned char var; unsigned short var; unsigned int var; unsigned long var; unsigned hyper var;

5 float var; double var; quadruple var;

6 bool var;

7 enum var {name const,;..}

8 opaque varfn];

9 opaque var<m>;

10 string var<m>

11 datatype var[n];

12 datatype var<m>

13 struct var {members...};

14 union var switch (int disc) {

case discvalueA: armdeclA; case discvalueB: amrdeclB; ... default: defaultdecl;

#define name value typedef declaration;

char var; short var; int var; long var; longlong t var;

u char var; u short var; u int var; u long var; u longlong t var; float var; double var; quadruple var; bool t var;

enum var {name = const,...}; typedef enum var var; char var[n]; struct {

u int var len;

char var val; }val;

char var; datatype var[n]; struct {

u int varjen;

datatype var val; } var;

sturct var {members...}; typedef struct var var; struct var { int disc; union { armdeclA; armdeclB;



№ Файл спецификации RPC (.х)

Заголовочный файл языка С (.h)

15 datatype name;

defaultdecl; } var u;

typedef struct var var; datatype name;

Опишем содержимое таблицы более подробно.

1. Декларация const преобразуется в Idef i ne.

2. Декларация typedef преобразуется в typedef.

3. Пять целых типов со знаком. Передаются XDR как 32-разрядные значения (первые четыре типа), а последний - как 64-разрядное.

ПРИМЕЧАНИЕ-

64-разрядное целое поддерживается многими компиляторами С как формат long long int или просто long long. Многие, но не все компиляторы и операционные системы поддерживают такой формат. Поскольку в созданном заголовочном файле объявляются переменные типа longlong t, в другом заголовочном файле должно содержаться следующее определение:

typedef long long longlong t:

Длинное целое в XDR занимает 32 бита, но длинное целое языка С в 64-.разрядных системах Unix может занимать и 64 бита (например, в модели LP64, описанной в [24, с. 27]). Имена формата XDR устарели лет на десять и не слишком соответствуют современным стандартам. Лучше, если бы они назывались как-Н1будь вроде int8 t, intl6 tHT. д.

4. Пять целых типов без знака. Первые 4 передаются как 32-разрядные значения, а последнее - как 64-разрядное.

5. Три типа данных с плавающей точкой. Первый передается как 32-разрядное значение, второй - как 64-разрядное, а третий - как 128-разрядное.

ПРИМЕЧАНИЕ--

Четверная точность для чисел с плавающей точкой (quadruple precision) поддерживается в С для типов long double. Не все компиляторы и операционные системы его воспринимают. Ваш компилятор может пропустить long double, но работать с этой переменной как с double. Поскольку в созданном заголовочном файле объявляются переменные типа quadruple, нужно создать другой заголовочный файл с объявлением

typedef long double quadruple;

В Solaris 2.6, например, нам пришлось бы включить строку include <floatingpoint.h>

в начало файла спецификации RPC, потому что этот заголовочный файл содержит требуемое определение. Знак процента перед #include говорит профамме фcgen о необходимости поместить остаток строки непосредственно в создаваемый заголовочный файл.

6. Тип bool еап эквивалентен целому со знаком. Заголовки RPC также определяют константу TRUE равной 1, а FALSE равной 0.



7. Перечисление (enumerati on) эквивалентно целому со знаком и совпадает с типом данных enum в С. rpcgen также создает определение типа для данной переменной.

8. Скрытые данные фиксированной длины передаются библиотекой как 8-разрядные значения без интерпретации.

9. Скрытые данные переменной длины также представляют собой последовательность неинтерпретируемых данных, но количество реально передаваемых данных помещается в целочисленную переменную и посылается перед самими данными. При отправке данных такого типа (например, при заполнении списка аргументов перед вызовом RPC) следует указать длину, прежде чем делать вызов. При приеме данного типа данных следует выяснить значение длины, чтобы определить, сколько данных будет принято.

10. Строка представляет собой последовательность ASCII-символов. В памяти строка хранится как обычная строка символов языка С, завершаемая нулем, но при передаче перед ней отправляется целое без знака, в которое помещается количество символов данной строки (без завершающего нуля). При отправке данных такого типа размер строки определяется библиотекой с помощью вызова strlen. При приеме данные такого типа помещаются в строку символов С, завершаемую нулем.

И. Массив фиксированной длины любого типа передается как последовательность п элементов данного типа.

12. Массив переменной длины любого типа передается как целое без знака, указывающее количество элементов, и последовательность элементов данного типа.

, Максимальное количество элементов в объявлении может быть опущено. Но если это количество указать при компиляции программы, библиотека будет проверять, не превосходит ли реальная длина указанного значения т.

13. Структура передается как последовательность полей, rpcgen также создает определение типа для данного имени переменной (typedef).

14. Размеченное объединение состоит из целочисленного дискриминанта и набора типов данных (ветвей), зависящих от значения дискриминанта. В табл. 16.2 мы показываем, что дискриминант должен быть типа 1 nt, но он может быть и unsigned int, и enum, и bool (все эти типы передаются как 32-разрядные целые). При передаче размеченного объединения передается 32-разрядное значение дискриминанта, за которым следует значение той ветви, которая ему соответствует. В ветви def aul t часто объявляется тип voi d, что означает отсутствие передаваемой вслед за дискриминантом информации. Ниже мы продемонстрируем это на примере.

15. Дополнительные данные представляют собой специальный тип объединения, описанный в примере из листинга 16.24. Объявление XDR выглядит как объявление указателя в языке С, и именно указатель объявляется в созданном заголовочном файле.

На рис. 16.3 сведена информация о кодировании различных типов данных bXDR.



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

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