Читаем UNIX Network Programming. Volume 2 Second Edition. Interprocess Communications полностью

Дескрипторы передаются через дверь от клиента серверу путем присваивания полю desc_ptr структуры door_arg_t значения указателя на массив структур типа door_desc_t и помещения в поле desc_num количества этих структур. Дескрипторы передаются от сервера клиенту путем присваивания третьему аргументу door_return значения указателя на массив структур door_desc_t и помещения в четвертый аргумент количества передаваемых дескрипторов:

Рис. 15.4. Сервер файлов, передающий клиенту дескриптор

typedef struct door_desc {

 door_attr_t d_attributes; /* тег объединения */

 union {

  struct { /* верна, если tag = DOOR_DESCRIPTOR */

   int d_descriptor; /* номер дескриптора */

   door_id_t d_id; /* уникальный идентификатор */

  } d_desc;

 } d_data;

} door_desc_t;

Эта структура содержит объединение (union), и первое поле структуры является тегом, идентифицирующим содержимое этого объединения. В настоящий момент определено только одно поле объединения (структура d_desc, описывающая дескриптор), и тег (d_attributes) должен иметь значение DOOR_DESCRIPTOR.

<p>Пример</p>

Изменим наш пример с сервером файлов таким образом, чтобы сервер открывал файл, передавал дескриптор клиенту, а клиент копировал содержимое файла в стандартный поток вывода. На рис. 15.4 приведена схема приложения. В листинге 15.15 приведен текст программы клиента.

Листинг 15.15. Клиент для сервера, передающего дескриптор

//doors/clientfd1.c

1  #include "unpipc.h"

2  int

3  main(int argc, char **argv)

4  {

5   int door, fd;

6   char argbuf[BUFFSIZE], resbuf[BUFFSIZE], buff[BUFFSIZE];

7   size_t len, n;

8   door_arg_t arg;

9   if (argc != 2)

10   err_quit("usage: clientfd1 server-pathname");

11  door = Open(argv[1], O_RDWR); /* открываем дверь */

12  Fgets(argbuf, BUFFSIZE, stdin); /* считываем полное имя открываемого файла */

13  len = strlen(argbuf);

14  if (argbuf[len-1] == '\n')

15   len--;

16  /* подготавливаем аргумент и указатель на результат */

17  arg.data_ptr = argbuf; /* аргумент-данные */

18  arg.data_size = len + 1; /* размер данных */

19  arg.desc_ptr = NULL;

20  arg.desc_num = 0;

21  arg.rbuf = resbuf; /* результаты-данные */

22  arg.rsize = BUFFSIZE; /* размер возвращаемых данных */

23  Door_call(door, arg); /* вызов процедуры сервера */

24  if (arg.data_size != 0)

25   err_quit("%.*s", arg.data_size, arg.data_ptr);

26  else if (arg.desc_ptr == NULL)

27   err_quit("desc_ptr is NULL");

28  else if (arg.desc_num != 1)

29   err_quit("desc_num = %d", arg.desc_num);

30  else if (arg.desc_ptr-d_attributes != DOOR_DESCRIPTOR)

31   err_quit("d_attributes = %d", arg.desc_ptr-d_attributes);

32  fd = arg.desc_ptr-d_data.d_desc.d_descriptor;

33  while((n = Read(fd, buff, BUFFSIZE)) 0)

34   Write(STDOUT_FILENO, buff, n);

35  exit(0);

36 }

Открываем дверь, считываем полное имя файла

9-15 Имя файла, связанного с дверью, принимается в качестве аргумента командной строки. Имя файла, который должен быть открыт и выведен, считывается из стандартного потока ввода, а завершающий символ перевода строки удаляется.

Подготовка аргументов и указателя на буфер возврата

16-22 Подготавливается структура door_arg_t. К размеру имени файла мы добавляем единицу, чтобы сервер мог дополнить его завершающим нулем.

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

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT