При создании новой очереди сообщений инициализируются следующие поля структуры msqid_ds:
■ полям uid и cuid структуры msg_perm присваивается значение действующего идентификатора пользователя вызвавшего процесса, а полям gid и cgid — действующего идентификатора группы;
■ разрешения чтения-записи, указанные в oflag, помещаются в msg_perm.mode;
■ значения msg_qnum, msg_lspid, msg_lrpid, msg_stime и msg_rtime устанавливаются в 0;
■ в msg_ctime записывается текущее время;
■ в msg_qbytes помещается системное ограничение на размер очереди.
6.3. Функция msgsnd
После открытия очереди сообщений с помощью функции msgget можно помещать сообщения в эту очередь с помощью msgsnd.
#include sys/msg.h
int msgsnd(int
/* Возвращает 0 в случае успешного завершения; –1 – в случае ошибки */
Здесь
struct msgbuf {
long mtype; /* тип сообщения, должен быть 0 */
char mtext[1]; /* данные */
};
Тип сообщения должен быть больше нуля, поскольку неположительные типы используются в качестве специальной команды функции msgrcv, о чем рассказывается в следующем разделе.
Название 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 – в случае ошибки */
Аргумент