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

3.1. Использование семафоров

Перед тем как использовать семафоры (выполнять операции или управляющие действия), нужно создать множество семафоров с уникальным идентификатором и ассоциированной структурой данных. Уникальный идентификатор называется идентификатором множества семафоров (semid); он используется для обращений к множеству и структуре данных.

С точки зрения реализации множество семафоров представляет собой массив структур. Каждая структура соответствует семафору и определяется следующим образом:

struct sem {

ushort semval; /* Значение семафора */

short sempid; /* Идентификатор процесса, выпол-

нявшего последнюю операцию */

ushort semncnt; /* Число процессов, ожидающих

увеличения значения семафора */

ushort semzcnt; /* Число процессов, ожидающих

обнуления значения семафора */

};

Определение находится во включаемом файле <sys/sem.h>.

С каждым идентификатором множества семафоров ассоциирована структура данных, содержащая следующую информацию:

struct semid_ds {

struct ipc_perm sem_perm; /* Структура прав на

выполнение операций */

struct sem *sem_base; /* Указатель на первый

семафор в множестве */

ushort sem_nsems; /* Количество семафоров в

множестве */

time_t sem_otime; /* Время последней операции */

time_t sem_ctime; /* Время последнего

изменения */

};

Это определение также находится во включаемом файле <sys/sem.h>. Отметим, что поле sem_perm данной структуры использует в качестве шаблона структуру ipc_perm, общую для всех средств межпроцессной связи (см. выше раздел ОЧЕРЕДИ СООБЩЕНИЙ).

Системный вызов semget(2) аналогичен вызову msgget(2) (разумеется, с заменой слов "очередь сообщений" на "множество семафоров"). Он также предназначен для получения нового или опроса существующего идентификатора, а нужное действие определяется значением аргумента key. В аналогичных ситуациях semget(2) терпит неудачу. Единственное отличие состоит в том, что при создании требуется посредством аргумента nsems указывать число семафоров в множестве.

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

3.2. Создание множеств семафоров

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

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semget (key, nsems, semflg)

key_t key;

int nsems, semflg;

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

Смысл аргументов key и semflg тот же, что и у соответствующих аргументов системного вызова msgget(2). Аргумент nsems задает число семафоров в множестве. Если запрашивается идентификатор существующего множества, значение nsems не должно превосходить числа семафоров в множестве.

Превышение системных параметров SEMMNI, SEMMNS и SEMMSL при попытке создать новое множество всегда ведет к неудачному завершению. Системный параметр SEMMNI определяет максимально допустимое число уникальных идентификаторов множеств семафоров в системе. Системный параметр SEMMNS определяет максимальное общее число семафоров в системе. Системный параметр SEMMSL определяет максимально допустимое число семафоров в одном множестве.

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