Аргумент
Аргумент
■ если значение
■ если тип больше 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 sys/msg.h
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;
8 msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
9 buf.mtype = 1;
10 buf.mtext[0] = 1;
11 Msgsnd(msqid, buf, 1, 0);
12 Msgctl(msqid, IPC_STAT, info);
13 printf("read-write: *03o, cbytes = %lu, qnum = %lu, qbytes = %lu\n",
14 info.msg_perm.mode 0777, (ulong_t) info.msg_cbytes,
15 (ulong_t) info.msg_qnum, (ulong_t) info.msg_qbytes);
16 system("ipcs –q");
17 Msgctl(msqid, IPC_RMID, NULL);
18 exit(0);
19 }
Мы собираемся отправить сообщение размером 1 байт, поэтому можно просто воспользоваться стандартным определением структуры msgbuf из sys/msg.h. Выполнение этой программы приведет к следующему результату:
solaris %ctl