Основы операционных систем. Практикум

       

Создание очереди сообщений или доступ к уже существующей. Системный вызов msgget()


Для создания очереди сообщений, ассоциированной с определенным ключом, или доступа по ключу к уже существующей очереди используется системный вызов msgget(), являющийся аналогом системных вызовов shmget() для разделяемой памяти и semget() для массива семафоров, который возвращает значение IPC-дескриптора для этой очереди. При этом существуют те же способы создания и доступа, что и для разделяемой памяти или семафоров (см. семинары 6–7 раздел "Разделяемая память в UNIX. Системные вызовы shmget(), shmat(), shmdt()" и см. семинар 8 раздел "Создание массива семафоров или доступ к уже существующему. Системный вызов semget()", соответственно).

Системный вызов msgget()

Прототип системного вызова

#include <types.h> #include <ipc.h> #include <msg.h>

int msgget(key_t key, int msgflg);

Описание системного вызова

Системный вызов msgget предназначен для выполнения операции доступа к очереди сообщений и, в случае ее успешного завершения, возвращает дескриптор System V IPC для этой очереди (целое неотрицательное число, однозначно характеризующее очередь сообщений внутри вычислительной системы и использующееся в дальнейшем для других операций с ней).

Параметр key является ключом System V IPC для очереди сообщений, т. е. фактически ее именем из пространства имен System V IPC. В качестве значения этого параметра может быть использовано значение ключа, полученное с помощью функции ftok(), или специальное значение IPC_PRIVATE. Использование значения IPC_PRIVATE всегда приводит к попытке создания новой очереди сообщений с ключом, который не совпадает со значением ключа ни одной из уже существующих очередей и не может быть получен с помощью функции ftok() ни при одной комбинации ее параметров.

Параметр msgflg – флаги – играет роль только при создании новой очереди сообщений и определяет права различных пользователей при доступе к очереди, а также необходимость создания новой очереди и поведение системного вызова при попытке создания. Он является некоторой комбинацией (с помощью операции побитовое или – "|") следующих предопределенных значений и восьмеричных прав доступа:

  • IPC_CREAT — если очереди для указанного ключа не существует, она должна быть создана;
  • IPC_EXCL — применяется совместно с флагом IPC_CREAT. При совместном их использовании и существовании массива с указанным ключом доступ к очереди не производится и констатируется ошибочная ситуация, при этом переменная errno, описанная в файле <errno.h>, примет значение EEXIST;
  • 0400 — разрешено чтение для пользователя, создавшего очередь;
  • 0200 — разрешена запись для пользователя, создавшего очередь;
  • 0040 — разрешено чтение для группы пользователя, создавшего очередь;
  • 0020 — разрешена запись для группы пользователя, создавшего очередь;
  • 0004 — разрешено чтение для всех остальных пользователей;
  • 0002 — разрешена запись для всех остальных пользователей;

Очередь сообщений имеет ограничение по общему количеству хранимой информации, которое может быть изменено администратором системы. Текущее значение ограничения можно узнать с помощью команды

ipcs -l

Возвращаемое значение

Системный вызов возвращает значение дескриптора System V IPC для очереди сообщений при нормальном завершении и значение -1 при возникновении ошибки.



Содержание раздела