Операционная система UNIX. Руководство программиста

     

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


Перед тем как использовать семафоры (выполнять операции или управляющие действия), нужно создать множество семафоров с уникальным идентификатором и ассоциированной структурой данных. Уникальный идентификатор называется идентификатором множества семафоров (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) для выполнения управляющих действий.



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