на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


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



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

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

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


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


4.10. Потоки и сообщения | UNIX: взаимодействие процессов | Листинг 4.13. Функция mesg_send