Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

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

Шрифт:
Листинг 16.4. Процедура сервера с 5-секундной паузой

//sunrpc/square2/server.c

1 #include "unpipc.h"

2 #include "square.h"

3 square_out *

4 squareproc_1_svc(square_in *inp, struct svc_req *rqstp)

5 {

6 static square_out out;

7 printf("thread %ld started, arg = %ld\n",

8 pr_thread_id(NULL), inp->arg1);

9 sleep(5);

10 out.res1 = inp->arg1 * inp->arg1;

11 printf("thread %ld done\n", pr_thread_id(NULL));

12 return(&out);

13 }

Запустим сервер, а после этого запустим три экземпляра программы-клиента:

solaris % client localhost 22 & client localhost 33& client localhost 44 &

[3] 25179

[4] 25180

[5] 25181

solaris % result: 484 примерно через 5 секунд после появления подсказки

result: 1936 еще через 5 секунд

result: 1089 еще через 5 секунд

Хотя этого нельзя сказать по выводимому тексту, перед появлением очередного результата проходит примерно 5 секунд. Если мы посмотрим на текст, выводимый сервером, то увидим, что клиенты обрабатываются последовательно: сначала полностью обрабатывается запрос первого клиента, затем второго и третьего:

solaris % server

thread 1 started, arg = 22

thread 1 done

thread 1 started, arg = 44

thread 1 done

thread 1 started, arg = 33

thread 1 done

Один и тот же поток обслуживает все запросы клиентов. Сервер не является многопоточным по умолчанию.

ПРИМЕЧАНИЕ

Серверы дверей в главе 15 работали не в фоновом режиме, а запускались из интерпретатора. Это давало нам возможность добавлять отладочные вызовы printf в процедуры сервера. Однако серверы Sun RPC по умолчанию являются демонами и выполняют действия так, как это описано в разделе 12.4 [24]. Это требует вызова syslog из процедуры сервера для вывода диагностической информации. Однако мы указали флаг –DDEBUG при компиляции нашего сервера, что эквивалентно определению

#define DEBUG

в заглушке сервера (файле square_svc.c, создаваемом rpcgen). Это запрещает функции main становиться демоном и оставляет ее подключенной к терминалу, в котором она была запущена. Поэтому мы можем спокойно вызывать printf из процедуры сервера.

Возможность создания многопоточного сервера появилась в Solaris 2.4 и реализуется добавлением параметра –М в строку вызова rpcgen. Это делает код, создаваемый rpcgen, защищенным. Другой параметр, –А, позволяет автоматически создавать потоки по мере необходимости для обслуживания запросов клиентов. Мы включаем оба параметра при вызове rpcgen.

Однако для реализации многопоточности требуется внести изменения в текст клиента и сервера, чего мы могли ожидать, поскольку использовали тип static в листинге 16.3. Единственное изменение, которое нужно внести в файл square.х, — сменить номер версии с 1 на 2. В объявлениях аргументов процедуры и результатов ничего не изменится.

В листинге 16.5 приведен текст новой программы-клиента.

Листинг 16.5. Функция main клиента многопоточного сервера

//sunrpc/square3/client.c

1 #include "unpipc.h"

2 #include "square.h"

3 int

4 main(int argc, char **argv)

5 {

6 CLIENT *cl;

7 square_in in;

8 square_out out;

9 if (argc != 3)

10 err_quit("usage: client <hostname> <integer-value>");

11 cl = Clnt_create(argv[1], SQUARE_PROG, SQUARE_VERS, "tcp");

12 in.arg1 = atol(argv[2]);

13 if (squareproc_2(&in, &out, cl) != RPC_SUCCESS)

14 err_quit("%s", clnt_sperror(cl, argv[1]));

15 printf("result: %ld\n", out.res1);

16 exit(0);

17 }

Объявление переменной для помещения результата

8 Мы объявляем переменную типа square_out, а не указатель на нее. 

Новый аргумент в вызове процедуры

12-14 Вторым аргументом вызова squareproc_2 становится указатель на переменную out, а последним аргументом является дескриптор клиента. Вместо возвращения указателя на результат (как в листинге 16.2) эта функция будет возвращать либо RPC_SUCCESS, либо некоторое другое значение в случае возникновения ошибок. Перечисление enumclnt_stat в заголовочном файле <rpc/clnt_stat.h> содержит все возможные коды ошибок.

  • Читать дальше
  • 1
  • ...
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: