Пример
Пример
Программа в листинге 6.1 создает очередь сообщений, помещает в нее сообщение с 1 байтом информации, вызывает функцию msgctl с командой IPC_STAT, выполняет команду ipcs, используя функцию system, а затем удаляет очередь, вызвав функцию msgctl с командой IPC_RMID.
Листинг 6.1.[1] Пример использования функции msgctl с командой IPC_STAT
//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 ",
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
read-write: 664, cbytes = 1, qnum = 1, qbytes = 4096
IPC status from <running system> as of MOn Oct 20 15:36:49 1997
T ID Key MODE OWNER GROUP
Message Queues:
q 1150 00000000 –rw-rw-r-- rstevens other1
Выведенные значения соответствуют ожидаемым. Нулевое значение ключа обычно соответствует IPC_PRIVATE, как мы отмечали в разделе 3.2. В этой системе на очередь сообщений накладывается ограничение по объему в 4096 байт. Поскольку мы записали сообщение с 1 байтом данных и msg_cbytes имеет значение 1, это ограничение накладывается на объем полезных данных и не включает тип сообщения (long), указываемый для каждого сообщения.
Данный текст является ознакомительным фрагментом.