Если верно одно из этих условий и установлен флаг IPC_NOWAIT, функция msgsnd возвращает ошибку с кодом EAGAIN. Если флаг IPC_NOWAIT не указан, а одно из этих условий выполняется, поток приостанавливается до тех пор, пока не произойдет одно из следующего:
■ для сообщения освободится достаточно места;
■ очередь с идентификатором
■ вызвавший функцию поток будет прерван перехватываемым сигналом (в этом случае возвращается ошибка с кодом EINTR).
6.4. Функция msgrcv
Сообщение может быть считано из очереди с помощью функции msgrcv.
#include
ssize_t msgrcv(int
/* Возвращает количество данных в сообщении, –1 – в случае ошибки */
Аргумент
Аргумент
Аргумент
■ если значение
■ если тип больше 0, возвращается первое сообщение, тип которого равен указанному;
■ если тип меньше нуля, возвращается первое сообщение с наименьшим типом, значение которого меньше либо равно модулю аргумента
Рассмотрим пример очереди сообщений, изображенный на рис. 6.1. В этой очереди имеются три сообщения:
■ первое сообщение имеет тип 100 и длину 1;
■ второе сообщение имеет тип 200 и длину 2;
■ третье сообщение имеет тип 300 и длину 3.
Таблица 6.1 показывает, какое сообщение будет возвращено при различных значениях аргумента
Таблица 6.1. Возвращаемое сообщение в зависимости от аргумента type
type | Тип возвращаемого сообщения |
---|---|
0 | 100 |
100 | 100 |
200 | 200 |
300 | 300 |
-100 | 100 |
-200 | 100 |
-300 | 100 |
Аргумент
■ появится сообщение с запрошенным типом;
■ очередь с идентификатором
■ вызвавший поток будет прерван перехватываемым сигналом (в этом случае возвращается ошибка EINTR).
В аргументе
В случае успешного завершения работы msgrcv возвращает количество байтов в принятом сообщении. Оно не включает байты, нужные для хранения типа сообщения (long), который также возвращается через указатель
6.5. Функция msgctl
Функция msgctl позволяет управлять очередями сообщений:
#include
int msgctl(int
/* Возвращает 0 в случае успешного завершения, –1 в случае ошибки */
Команд (аргумент
■ IPC_RMID — удаление очереди с идентификатором
■ IPC_SET — установка значений четырех полей структуры msqid_ds данной очереди равными значениям соответствующих полей структуры, на которую указывает аргумент
■ IPC_STAT — возвращает вызвавшему процессу (через аргумент
Пример
Программа в листинге 6.1 создает очередь сообщений, помещает в нее сообщение с 1 байтом информации, вызывает функцию msgctl с командой IPC_STAT, выполняет команду ipcs, используя функцию system, а затем удаляет очередь, вызвав функцию msgctl с командой IPC_RMID.
//svmsg/ctl.с
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int msqid;
6 struct msqid_ds info;
7 struct msgbuf buf;