Перед тем как использовать семафоры (выполнять операции или управляющие
действия), нужно создать множество семафоров с уникальным идентификатором
и ассоциированной структурой данных. Уникальный идентификатор называется
идентификатором
множества семафоров (semid); он используется для обращений
к множеству и структуре данных. С точки зрения реализации множество
семафоров представляет собой массив структур. Каждая структура соответствует
семафору и определяется следующим образом:
ushort semval; /* Значение семафора */
/* Идентификатор процесса, выполнявшего
последнюю операцию */
short sempid;
/* Число процессов, ожидающих увеличения
значения семафора */
ushort semncnt;
/* Число процессов, ожидающих обнуления
значения семафора */
ushort semzcnt;
};
С каждым идентификатором множества семафоров ассоциирована структура данных, содержащая следующую информацию:
/*Структура прав на выполнение операций*/
struct ipc_perm sem_perm;
/*Указатель на первый семафор в множестве*/
struct sem *sem_base;
/* Количество семафоров в множестве */
ushort sem_nsems;
/* Время последней операции */
time_t sem_otime;
/* Время последнего изменения */
time_t sem_ctime;
};
Поле sem_perm данной структуры использует в качестве шаблона структуру типа ipc_perm, общую для всех средств межпроцессной связи. Системный вызов semget аналогичен вызову msgget (разумеется, с заменой слов ``очередь сообщений'' на ``множество семафоров''). Он также предназначен для получения нового или опроса существующего идентификатора, а нужное действие определяется значением аргумента key. В подобных ситуациях semget терпит неудачу. Единственное отличие состоит в том, что при создании требуется посредством аргумента nsems указывать число семафоров в множестве.
После того как созданы множество семафоров с уникальным идентификатором и ассоциированная с ним структура данных, можно использовать системные вызовы semop для операций над семафорами и semctl - для выполнения управляющих действий.