В листинге 6.17 приведен текст функции client. Эта функция практически идентична функции из листинга 6.15, но вместо передачи идентификатора процесса клиента на сервер направляется идентификатор очереди клиента. Тип сообщения в структуре mesg остается равным 1, поскольку это значение устанавливается для сообщений, передаваемых в обе стороны. В листинге 6.19 приведена функция server. Главное отличие от листинга 6.13 в том, что эта функция представляет собой бесконечный цикл, в котором для каждого нового клиента вызывается fork.Листинг 6.17. Функция client
//svmsgmpxnq/client.с
1 #include "mesg.h"
2 void
3 client(int readid, int writeid)
4 {
5 size_t len;
6 ssize_t n;
7 char *ptr;
8 struct mymesg mesg;
9 /* инициализируем буфер идентификатором очереди и пробелом */
10 snprintf(mesg.mesg_data, MAXMESGDATA, "%d ", readid);
11 len = strlen(mesg.mesg_data);
12 ptr = mesg.mesg_data + len;
13 /* считываем имя файла */
14 Fgets(ptr, MAXMESGDATA – len, stdin);
15 len = strlen(mesg.mesg_data);
16 if (mesg.mesg_data[len-1] == '\n')
17 len--; /* удаляем перевод строки fgets() */
18 mesg.mesg_len = len;
19 mesg.mesg_type = 1;
20 /* отправляем идентификатор очереди и имя файла серверу */
21 Mesg_send(writeid, &mesg);
22 /* считываем ответ из нашей очереди и записываем его в stdout */
23 while ((n = Mesg_recv(readid, &mesg)) > 0)
24 Write(STDOUT_FILENO, mesg.mesg_data, n);
25 }