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


Разделяемая память в UNIX. Системные вызовы shmget(), shmat(), shmdt() - часть 2


Наличие флагов IPC_CREAT и IPC_EXCL в этом случае игнорируется.

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

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

#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h>

int shmget(key_t key, int size, int shmflg);

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

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

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

Параметр size. определяет размер создаваемого или уже существующего сегмента в байтах. Если сегмент с указанным ключом уже существует, но его размер не совпадает с указанным в параметре size, констатируется возникновение ошибки.

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

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

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

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

<


Начало  Назад  Вперед



Книжный магазин