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

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

Жанры

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

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

Шрифт:

3 client(int readfd, int writefd)

4 {

5 size_t len;

6 ssize_t n;

7 char *ptr;

8 struct mymesg mesg;

9 /* инициализируем буфер идентификатором процесса и пробелом */

10 snprintf(mesg.mesg_data, MAXMESGDATA. "%ld ", (long) getpid);

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 /* записываем PID и имя файла в канал IPC */

21 Mesg_send(writefd, &mesg);

22 /* считываем из канала IPC, записываем в stdout */

23 mesg.mesg_type = getpid;

24 while ((n = Mesg_recv(readfd, &mesg)) > 0)

25 Write(STDOUT_FILENO, mesg.mesg_data, n);

26 }
 

Пример: одна очередь для каждого клиента

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

Рис. 6.3. Одна очередь для сервера и по одной для каждого клиента

Ключ очереди сервера должен быть известен клиентам, а сами клиенты создают свои очереди с ключом IPC_PRIVATE. Вместо передачи серверу идентификатора процесса клиенты сообщают ему идентификатор своей очереди, в которую сервер направляет свой ответ. Этот сервер является параллельным: для каждого нового клиента порождается отдельный процесс.

ПРИМЕЧАНИЕ

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

Нижеследующие заголовочные файлы и функции не претерпевают изменений по сравнению с предыдущими версиями:

■ mesg.h (листинг 4.12);

■ svmsg.h (листинг 6.7);

■ функция main сервера (листинг 6.12);

■ функция mesg_send (листинг 4.13).

Функция main клиента приведена в листинге 6.16; она слегка изменилась по сравнению с листингом 6.14. Мы открываем очередь сервера с известным ключом (MQ_KEY1) и создаем нашу собственную очередь с ключом IPC_PRIVATE. Два идентификатора этих очередей становятся аргументами функции client (листинг 6.17). После завершения работы клиента его персональная очередь удаляется.

Листинг 6.16. Функция main клиента

//svmsgmpxnq/client_main.с

1 #include "svmsg.h"

2 void client(int, int);

3 int

4 main(int argc, char **argv)

5 {

6 int readid, writeid;

7 /* сервер должен создать свою очередь */

8 writeid = Msgget(MQ_KEY1, 0);

9 /* мы создаем свою собственную очередь */

10 readid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);

11 client(readid, writeid);

12 /* и удаляем нашу собственную очередь */

13 Msgctl(readid, IPC_RMID, NULL);

14 exit(0);

15 }

Листинг 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 }

В листинге 6.17 приведен текст функции client. Эта функция практически идентична функции из листинга 6.15, но вместо передачи идентификатора процесса клиента на сервер направляется идентификатор очереди клиента. Тип сообщения в структуре mesg остается равным 1, поскольку это значение устанавливается для сообщений, передаваемых в обе стороны.

В листинге 6.19 приведена функция server. Главное отличие от листинга 6.13 в том, что эта функция представляет собой бесконечный цикл, в котором для каждого нового клиента вызывается fork.

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

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

Сильнейший Столп Империи. Книга 4

Ермоленков Алексей
4. Сильнейший Столп Империи
Фантастика:
фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 4

Третий Генерал: Том VII

Зот Бакалавр
6. Третий Генерал
Фантастика:
городское фэнтези
аниме
сказочная фантастика
попаданцы
5.00
рейтинг книги
Третий Генерал: Том VII

Виконт. Книга 2. Обретение силы

Юллем Евгений
2. Псевдоним `Испанец`
Фантастика:
боевая фантастика
попаданцы
рпг
7.10
рейтинг книги
Виконт. Книга 2. Обретение силы

Лейтенант. Назад в СССР. Книга 8. Часть 1

Гаусс Максим
8. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Лейтенант. Назад в СССР. Книга 8. Часть 1

Схрон

Головачев Василий Васильевич
2. Смутное время
Фантастика:
научная фантастика
8.08
рейтинг книги
Схрон

Золотой ворон

Сакавич Нора
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Золотой ворон

Громкие убийства

Смирнова Людмила Николаевна
Колесо фортуны
Научно-образовательная:
история
5.00
рейтинг книги
Громкие убийства

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11

Геном хищника. Книга третья

Гарцевич Евгений Александрович
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга третья

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Казачий князь

Трофимов Ерофей
5. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Казачий князь

Страж Кодекса. Книга VII

Романов Илья Николаевич
7. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга VII

Пограничная река. (Тетралогия)

Каменистый Артем
Пограничная река
Фантастика:
фэнтези
боевая фантастика
9.15
рейтинг книги
Пограничная река. (Тетралогия)