Читать «UNIX: взаимодействие процессов» онлайн - страница 95
Уильям Ричард Стивенс
Название mtext в структуре msgbuf употреблено не вполне правильно; данные в сообщении совсем не обязательно должны быть текстом. Разрешена передача любых типов данных как в двоичном, так и в текстовом формате. Ядро никак не интерпретирует содержимое сообщения.
Для описания структуры мы используем термин «шаблон», поскольку
Например, если приложению нужно передавать сообщения, состоящие из 16-разрядного целого, за которым следует 8-байтовый массив символов, оно может определить свою собственную структуру так:
#define MY_DATA 8
typedef struct my_msgbuf {
long mtype; /* тип сообщения */
int16_t mshort; /* начало данных */
char mchar[MY_DATA];
} Message;
Аргумент
Аргумент
■ в данной очереди уже имеется слишком много данных (значение msg_qbytes в структуре msqid_ds);
■ во всей системе имеется слишком много сообщений.
Если верно одно из этих условий и установлен флаг IPC_NOWAIT, функция msgsnd возвращает ошибку с кодом EAGAIN. Если флаг IPC_NOWAIT не указан, а одно из этих условий выполняется, поток приостанавливается до тех пор, пока не произойдет одно из следующего:
■ для сообщения освободится достаточно места;
■ очередь с идентификатором
■ вызвавший функцию поток будет прерван перехватываемым сигналом (в этом случае возвращается ошибка с кодом EINTR).
6.4. Функция msgrcv
Сообщение может быть считано из очереди с помощью функции msgrcv.
#include <sys/msg.h>
ssize_t msgrcv(int
/* Возвращает количество данных в сообщении, –1 – в случае ошибки */
Аргумент