Чтение онлайн

на главную - закладки

Жанры

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:

7 XOR xhandle;

8 char *buff;

9 long lval2, lval3, *lptr;

10 args out;

11 size_t size;

12 out.arg1.flag = TRUE;

13 out.arg1.optlong_u.val = 5;

14 lval2 = 9876;

15 out.arg2.arg2_len = 1;

16 out.arg2.arg2_val = &lval2;

17 lval3 = 123;

18 out.arg3 = &lval3;

19 buff = Malloc(BUFFSIZE); /* адрес должен быть кратен 4 */

20 xdrmem_create(&xhandle, buff, BUFFSIZE, XDR_ENCODE);

21 if (xdr_args(&xhandle, &out) != TRUE)

22 err_quit("xdr_args error");

23 size = xdr_getpos(&xhandle);

24 lptr = (long *) buff;

25 for (i = 0; i < size; i += 4)

26 printf("%ld\n", (long) ntohl(*lptr++));

27 exit(0);

28 }

Присваивание значений

12-18 Для присваивания значения объединению мы устанавливаем дискриминант в TRUE, а затем присваиваем значение полю long. Длину массива мы также сначала устанавливаем в 1. Указатель мы устанавливаем на соответствующее значение в памяти.

При запуске этой программы мы получим ожидаемые шесть 4-байтовых значений:

solaris % opt1

1 значение дискриминанта TRUE

5

1 длина массива переменной длины

9876

1 флаг для ненулевого указателя

123

Пример: обработка связного списка

Если осуществима передача необязательных данных, мы можем расширить возможности указателей в XDR и использовать их для кодирования и декодирования связных списков, содержащих произвольное количество элементов. В нашем примере используется связный список пар имя-значение. Соответствующий файл спецификации XDR приведен в листинге 16.21.

Листинг 16.21. Спецификация XDR для связного списка пар имя-значение

//sunrpc/xdr1/opt2.x

1 struct mylist {

2 string name<>;

3 long value;

4 mylist *next;

5 };

6 struct args {

7 mylist *list;

8 };

1-5 Структура mylist содержит одну пару имя-значение и указатель на следующую структуру такого типа. Указатель в последней структуре списка будет нулевым.

В листинге 16.22 приведен текст заголовочного файла, созданного программой rpcgen из файла opt2.х.

Листинг 16.22. Заголовочный файл, созданный программой rpcgen

//sunrpc/xdr1/opt2.h

7 struct mylist {

8 char *name;

9 long value;

10 struct mylist *next;

11 };

12 typedef struct mylist mylist;

13 struct args {

14 mylist *list;

15 };

16 typedef struct args args;

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

Листинг 16.23. Инициализация, кодирование связного списка и вывод результата

1 //sunrpc/xdr1/opt2.c

2 #include "unpipc.h"

3 #include "opt2.h"

4 int

5 main(int argc, char **argv)

6 {

7 int i;

8 XDR xhandle;

9 long *lptr;

10 args out; /* структура, которую мы заполняем */

11 char *buff; /* результат кодирования */

12 mylist nameval[4]; /* до четырех элементов в списке */

13 size_t size;

14 out.list = &nameval[2]; /* [2] –> [1] –> [0] */

15 nameval[2].name = "name1";

16 nameval[2].value = 0x1111;

17 nameval[2].next = &nameval[1];

18 nameval[1].name = "namee2";

19 nameval[1].value = 0x2222;

20 nameval[1].next = &nameval[0];

21 nameval[0].name = "nameee3";

22 nameval[0].value = 0x3333;

23 nameval[0].next = NULL;

24 buff = Malloc(BUFFSIZE); /* адрес должен быть кратен 4 */

25 xdrmem_create(&xhandle, buff, BUFFSIZE, XDR_ENCODE);

26 if (xdr_args(&xhandle, tout) != TRUE)

27 err_quit("xdr_args error");

28 size = xdr_getpos(&xhandle);

29 lptr = (long*)buff;

30 for (i = 0; i < size; i += 4)

31 printf("%8lx\n", (long)ntohl(*lptr++));

32 exit(0);

33 }

Инициализация связного списка
Поделиться:
Популярные книги

Громовая поступь. Трилогия

Мазуров Дмитрий
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Громовая поступь. Трилогия

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Гримуар темного лорда VII

Товарищ "Чума" 3

lanpirot
3. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 3

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Инженер Петра Великого 5

Гросов Виктор
5. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
4.75
рейтинг книги
Инженер Петра Великого 5

Хозяин Стужи 8

Петров Максим Николаевич
8. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 8

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Маска Цирцеи (сборник)

Каттнер Генри
Фантастика:
научная фантастика
6.25
рейтинг книги
Маска Цирцеи (сборник)

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Кодекс Охотника. Книга XXII

Винокуров Юрий
22. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXII

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 23

Личный аптекарь императора. Том 2

Карелин Сергей Витальевич
2. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Личный аптекарь императора. Том 2

Личинка

Привалов Сергей
1. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Личинка