Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ_СПО.docx
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
151.49 Кб
Скачать

4.2. Создание разделяемых сегментов памяти

Для создания разделяемого сегмента памяти служит системный вызов shmget(2). В статье shmget(2) Справочника программиста синтаксис данного системного вызова описан так:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget (key, size, shmflg)

key_t key;

int size, shmflg;

Целочисленное значение, возвращаемое в случае успешного завершения, есть идентификатор разделяемого сегмента (shmid). В случае неудачи результат равен -1.

Смысл аргументов key и shmflg тот же, что и у соответствующих аргументов системного вызова semget(2). Аргумент size задает размер разделяемого сегмента в байтах.

Системный параметр SHMMNI определяет максимально допустимое число уникальных идентификаторов разделяемых сегментов памяти (shmid) в системе. Попытка его превышения ведет к неудачному завершению системного вызова.

Системный вызов завершится неудачей и тогда, когда значение аргумента size меньше, чем SHMMIN, либо больше, чем SHMMAX. Данные системные параметры специфицируют, соответственно, минимальный и максимальный размеры разделяемого сегмента памяти.

В статье shmget(2) Справочника программиста описывается начальное значение ассоциированной структуры данных, формируемое в случае успешного завершения системного вызова.

4.3. Управление разделяемыми сегментами памяти

В данном пункте детально описывается использование системного вызова shmctl(2) и приводится программа-пример, позволяющая по- упражняться со всеми его возможностями.

4.3.1. Использование shmctl

В статье shmctl(2) Справочника программиста синтаксис данного системного вызова описан так:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmctl (shmid, cmd, buf)

int shmid, cmd;

struct shmid_ds *buf;

При успешном завершении результат равен нулю; в случае неудачи возвращается -1.

В качестве аргумента shmid должен выступать идентификатор разделяемого сегмента памяти, предварительно полученный при помощи системного вызова shmget(2).

Управляющее действие определяется значением аргумента cmd. Допустимы следующие значения:

    IPC_STAT 

 

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

    IPC_SET 

 

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

    IPC_RMID 

 

Удалить из системы идентификатор shmid, ликвидировать разделяемый сегмент памяти и ассоциированную с ним структуру данных.

    SHM_LOCK 

 

Удерживать в памяти разделяемый сегмент, заданный идентификатором shmid.

    SHM_UNLOCK 

 

Освободить (перестать удерживать в памяти) разделяемый сегмент, заданный идентификатором shmid.

Чтобы выполнить управляющее действие IPC_SET или IPC_RMID, про- цесс должен иметь действующий идентификатор пользователя, равный либо идентификаторам создателя или владельца очереди, либо идентификатору суперпользователя. Управляющие действия SHM_LOCK и SHM_UNLOCK может выполнить только суперпользователь. Для выполнения управляющего действияIPC_STAT процессу требуется право на чтение.