next up previous contents
Next: Создание множеств семафоров Up: Семафоры Previous: Основные сведения   Contents

Структуры данных семафоров

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



2004-06-22