Руководство программиста для Linux


Очереди сообщений - часть 2


Здесь мы также видим структуру сообщения, но второй элемент заменился на два, причем один из них - другая структура! В этом прелесть очередей сообщений, ядро не разбирает данные, какими бы они ни были.

Существует, однако, ограничение на максимальный размер сообщения.В LINUX-е он определен в linux/msg.h: #define MSGMAX 4056 /* <= 4056 */ /* максимальный размер сообщения, в байтах*/

Сообщения не могут быть больше, чем 4056 байт, сюда входит и элемент mtype, который занимает 4 байта (long).

Структура msg ядра

Ядро хранит сообщение в очереди структуры msg. Она определена в linux/msg.h следующим образом: struct msg { struct msg *msg_next; /* следующее сообщение в очереди */ long msg_type; char *msg_spot; /* адрес текста сообщения */ short msg_ts; /* размер текста */ }; msg_next

Указатель на следующее сообщение в очереди. Сообщения объединены в односвязный список и находятся в адресном пространстве ядра. msg_type Тип сообщения, каким он был объявлен в msgbuf. msg_spot Указатель на начало тела сообщения. msg_ts Длина текста (или тела) сообщения. Структура msqid_ds ядра

Каждый из трех типов IPC-объектов имеет внутреннее представление, которое поддерживается ядром. Для очередей сообщений это структура msqid_ds. Ядро создает, хранит и сопровождает образец такой структуры для каждой очереди сообщений в системе. Она определена в linux/msg.h следующим образом: /* структура msqid для каждой очереди в системе */ struct msqid_ds { struct ipc_perm msg_perm; struct msg *msg_first; /* первое сообщение в очереди */ struct msg *msg_last; /* последнее сообщение в очереди */ time_t msg_stime; /* время последнего вызова msgsnd */ time_t msg_rtime; /* время последнего вызова msgrcv */ time_t msg_ctime; /* время последнего изменения */ struct wait_queue *wwait; struct wait_queue *rwait; ushort msg_cbytes; ushort msg_qnum; ushort msg_qbytes; /* максимальное число байтов на очередь */ ushort msg_lspid; /* pid последнего испустившего msgsnd */ ushort msg_lrpid; /* последний полученный pid */ };




Начало  Назад  Вперед



Книжный магазин