Книга: UNIX: взаимодействие процессов

Пример

Пример

Программа в листинге 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 = %lun",
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), указываемый для каждого сообщения.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.047. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз