Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ_СПО.docx
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
151.49 Кб
Скачать

3.3. Управление семафорами

В данном пункте детально описывается использование системного вызова semctl(2) и приводится программа-пример, позволяющая поупражняться со всеми его возможностями.

3.3.1. Использование semctl

В статье semctl(2) Справочника программиста синтаксис данного системного вызова описан так:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semctl (semid, semnum, cmd, arg)

int semid, cmd;

int semnum;

union semun {

int val;

struct semid_ds *buf;

ushort *array;

} arg;

Результат системного вызова semctl(2) в случае успешного завершения зависит от выполняемого управляющего действия. Как правило он равен 0, но четыре действия (GETVAL, GETPID, GETNCNTи GETZCNT) являются исключениями. При возникновении ошибки всегда возвращается -1.

Аргументы semid и semnum определяют множество или отдельный семафор, над которым выполняется управляющее действие. В качестве аргумента semid должен выступать идентификатор множества семафоров, предварительно полученный при помощи системного вызова semget(2). Аргумент semnum задает номер семафора в множестве. Семафоры нумеруются с нуля.

Назначение аргумента arg зависит от управляющего действия, которое определяется значением аргумента cmd. Допустимы следующие действия:

    GETVAL 

 

Получить значение семафора и выдать его в качестве результата.

    SETVAL 

 

Установить значение семафора равным arg.val.

    GETPID 

 

Получить идентификатор процесса, последним выполнявшего операцию над семафором, и выдать его в качестве результата.

    GETNCNT 

 

Получить число процессов, ожидающих увеличения значения семафора, и выдать его в качестве результата.

    GETZCNT 

 

Получить число процессов, ожидающих обнуления значения семафора, и выдать его в качестве результата.

    GETALL 

 

Прочитать значения всех семафоров множества и поместить их в массив, на который указывает arg.array.

    SETALL 

 

Установить значения всех семафоров множества равными значениям элементов массива, на который указывает arg.array.

    IPC_STAT 

 

Поместить информацию о состоянии множества семафоров, содержащуюся в структуре данных, ассоциированной с идентификатором semid, в пользовательскую структуру, на которую указывает arg.buf.

    IPC_SET 

 

В структуре данных, ассоциированной с идентификатором semid, переустановить значения действующих идентификаторов пользователя и группы, а также прав на операции. Нужные значения извлекаются из структуры данных, на которую указывает arg.buf.

    IPC_RMID 

 

Удалить из системы идентификатор semid, ликвидировать множество семафоров и ассоциированную с ним структуру данных.

Чтобы выполнить управляющее действие IPC_SET или IPC_RMID, процесс должен иметь действующий идентификатор пользователя, равный либо идентификаторам создателя или владельца очереди, либо идентификатору суперпользователя. Для выполнения управляющих действий SETVAL и SETALL требуется право на изменение, а для выполнения остальных действий - право на чтение.