Перед тем как использовать семафоры (выполнять операции или управляющие действия), нужно создать множество семафоров с уникальным идентификатором и ассоциированной структурой данных. Уникальный идентификатор называется идентификатором множества семафоров (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 аналогичен вызову msgget (разумеется, с заменой слов ``очередь сообщений'' на ``множество семафоров''). Он также предназначен для получения нового или опроса существующего идентификатора, а нужное действие определяется значением аргумента key. В аналогичных ситуациях semget терпит неудачу. Единственное отличие состоит в том, что при создании требуется посредством аргумента nsems указывать число семафоров в множестве.
После того как созданы множество семафоров с уникальным идентификатором и ассоциированная с ним структура данных, можно использовать системные вызовы semop для операций над семафорами и semctl для выполнения управляющих действий.