Назад

Содержание

Вперед


1.7.3.2. Семафоры.

    Семафоры представляют собой стандартный способ разрешения или запрещения выполнять те или иные действия. Семафор - это обычно целое число. Если оно имеет значение 1 (установлен), то операция запрещена. Если его значение 0, то - разрешена. UNIX позволяет создавать сразу целые массивы семафоров. Они, как и другие объекты IPC, идентифицируются с помощью уникального ключа, задаваемого неотрицательным целым числом.

    Для создания массива семафоров используется системный вызов semget( ):

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semget (key_t key, int nsems, int flag);

    Здесь:

key - уникальный ключ объекта IPC;
nsems - количество семафоров в массиве;
flag - задание режима создания массива семафоров; аналогично параметру flag в msgget( ), только префикс "MSG" заменен "SEM".

    Функция semget( ) возвращает целое число, используемое для доступа к массиву семафоров.

    Устанавливать и получать значения элементов, а также управлять состоянием всего массива семафоров можно при помощи системного вызова semctl( ).

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semctl (int semid, int semnum, int cmd, union semun arg);

    Здесь:

semid - идентификатор массива семафоров, возвращаемый функцией semget( );
semnum - номер изменяемого элемента в массиве;
cmd - выполняемая операция; основные из них следующие:
GETVAL - получить значение семафора;
SETVAL - задать значение семафора;
IPC_RMID - удалить объект;
arg - объединение, используемое для передачи данных, необходимых для выполнения операции и/или получения ее результатов; например, ее поле val служит для задания и получения значения семафора.

    Пример работы с массивами семафоров приведен в следующем разделе.