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

Программа msgrcvid

Программа msgrcvid

Покажем теперь, что для получения доступа к очереди сообщений System V не обязательно вызывать msgget: все, что нужно, — это знать идентификатор очереди сообщений, который легко получить с помощью ipcs, и считать разрешения доступа для очереди. В листинге 6.6 приведен упрощенный вариант программы msgrcv из листинга 6.4.

Здесь мы уже не используем msgget. Вместо этого используется идентификатор очереди сообщений, являющийся обязательным аргументом командной строки.

Листинг 6.6. Считывание из очереди сообщений System V с известным идентификатором

//svmsg/msgrcvid.c
1  #include "unpipc.h"
2  #define MAXMSG (8192 + sizeof(long))
3  int
4  main(int argc, char **argv)
5  {
6   int mqid;
7   ssize_t n;
8   struct msgbuf *buff;
9   if (argc != 2)
10   err_quit("usage: msgrcvid <mqid>");
11  mqid = atoi(argv[1]);
12  buff = Maloc(MAXMSG);
13  n = Msgrcv(mqid, buff, MAXMSG, 0, 0);
14  printf("read %d bytes, type = %ldn", n, buff->mtype);
15  exit(0);
16 }

Вот пример использования этой программы:

solaris % touch /tmp/testid
solaris % msgcreate /tmp/testid
solaris % msgsnd /tmp/testid4 400
solaris % ipcs –qo
IPC status from <running system> as of Wed Mar 25 09:48:28 1998
T ID  KEY        MODE       OWNER    GROUP  CBYTES QNUM
Message Queues:
q 150 0x0000118a –rw-r--r-- rstevens other1 4      1
solaris % msgrcvid 150
read 4 bytes, type = 400

Идентификатор очереди (150) мы узнали с помощью ipcs, его мы и предоставляем программе msgrcvid в качестве аргумента командной строки.

Этот же метод можно использовать для семафоров System V (упражнение 11.1) и разделяемой памяти System V (упражнение 14.1).

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


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