The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Каталог документации / Раздел "Документация для Linux" / Оглавление документа
next up previous contents index
Next: Создание множеств семафоров Up: Семафоры Previous: Семафоры   Contents   Index

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

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



Alex Otwagin 2002-12-16

  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor