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

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

Жанры

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

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

Шрифт:

Мы можем структурировать данные, передаваемые по программному каналу или FIFO, самостоятельно. Определим сообщение в нашем заголовочном файле mesg.h, как показано в листинге 4.12.

Листинг 4.12. Структура mymesg и сопутствующие определения

//pipemesg/mesg.h

1 #include "unpipc.h"

2 /* Наши собственные "сообщения", которые могут использоваться с каналами, FIFO и очередями сообщений */

3 /* Мы хотим, чтобы sizeof(struct mymesg) <= PIPE_BUF */

4 #define MAXMESGDATA (PIPE_BUF – 2*sizeof(long))

5 /* Длина mesg_len и mesg_type */

6 #define MESGHDRSIZE (sizeof(struct mymesg) – MAXMESGDATA)

7 struct mymesg {

8 long mesg_len; //количество байтов в mesg_data, может быть О

9 long mesg_type;//тип сообщения, должен быть > 0

10 char mesg_data[MAXMESGDATA];

11 };

12 ssize_t mesg_send(int, struct mymesg *);

13 void Mesg_send(int, struct mymesg *);

14 ssize_t mesg_recv(int, struct mymesg *);

15 ssize_t Mesg_recv(int, struct mymesg *);

Каждое сообщение содержит в себе информацию о своем типе (mesg_type), причем значение этой переменной должно быть больше нуля. Пока мы будем игнорировать это поле в записи, но вернемся к нему в главе 6, где описываются очереди сообщений System V. Каждое сообщение также обладает длиной, кoтopая может быть и нулевой. Структура mymesg позволяет предварить каждое сообщение информацией о его типе и длине вместо использования символа перевода строки для сигнализации конца сообщения. Ранее мы отметили два преимущества этого подхода: получатель не должен сканировать все принятые байты в поисках конца сообщения и отсутствует необходимость исключать появление разделителя в самих данных.

На рис. 4.13 изображен вид структуры mymesg и ее использование с каналами, FIFO и очередями сообщений System V. 

Рис. 4.13. Структура mymesg

Мы определяем две функции для отправки и приема сообщений. В листинге 4.13 приведен текст функции mesg_send, а в листинге 4.14 — функции mesg_recv.

Листинг 4.13. Функция mesg_send

//pipemesg/mesg_send.c

1 #include "mesg.h"

2 ssize_t

3 mesg_send(int fd, struct mymesg *mptr)

4 {

5 return(write(fd, mptr, MESGHDRSIZE + mptr->mesg_len));

6 }

Листинг 4.14. Функция mesg_recv

//pipemesg/mesg_recv.c

1 #include "mesg.h"

2 ssize_t

3 mesg_recv(int fd, struct mymesg *mptr)

4 {

5 size_t len;

6 ssize_t n;

8 /* считывание заголовка сообщения для определения его длины */

9 if ((n = Read(fd, mptr, MESGHDRSIZE)) == 0)

10 return(0); /* end of file */

11 else if (n != MESGHDRSIZE)

12 err_quit("message header: expected %d, got %d". MESGHDRSIZE, n);

13 if ((len = mptr->mesg_len) > 0)

14 if ((n = Read(fd, mptr->mesg_data, len)) != len)

15 err_quit("message data: expected %d, got %d", len, n);

16 return(len);

17 }

Теперь для каждого сообщения функция read вызывается дважды: один раз для считывания длины, а другой — для считывания самого сообщения (если его длина больше 0).

ПРИМЕЧАНИЕ

Внимательные читатели могли заметить, что функция mesg_recv проверяет наличие всех возможных ошибок и прекращает работу при их обнаружении. Однако мы все же определили функцию-обертку Mesg_recv и вызываем из наших программ именно ее — для единообразия.

Изменим теперь функции client и server, чтобы воспользоваться новыми функциями mesg_send и mesg_recv. В листинге 4.15 приведен текст функции-клиента.

Листинг 4.15. Функция client с использованием сообщений

//pipemesg/client.c

1 #include "mesg.h"

2 void

3 client(int readfd, int writefd)

4 {

5 size_t len;

6 ssize_t n;

7 struct mymesg mesg;

8 /* считывание полного имени */

9 Fgets(mesg.mesg_data, MAXMESGDATA, stdin);

10 len = strlen(mesg.mesg_data);

11 if (mesg.mesg_data[len-1] == '\n')

12 len--; /* удаление перевода строки из fgets */

13 mesg.mesg_len = len;

14 mesg.mesg_type = 1;

15 /* запись полного имени в канал IPC */

16 Mesg_send(writefd, &mesg);

17 /* считывание из канала IPC. запись в stdout */

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

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

20 }

Считывание имени файла и отправка его серверу

8-16 Полное имя считывается из стандартного потока ввода и затем отправляется на сервер с помощью функции mesg_send.

Считывание содержимого файла или сообщения об ошибке от сервера
Поделиться:
Популярные книги

Кодекс Охотника XXVIII

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

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

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

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

Буря соперничества

Мазуров Дмитрий
4. Громовая поступь
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Буря соперничества

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 3

Анти-Ксенонская Инициатива

Вайс Александр
7. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Анти-Ксенонская Инициатива

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

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

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

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

Последний Паладин. Том 2

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

Барон

Первухин Андрей Евгеньевич
5. Ученик
Фантастика:
фэнтези
5.60
рейтинг книги
Барон

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

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

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.50
рейтинг книги
Вечный. Книга I

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота