
- •Статические и динамические библиотеки (сборка и использование)
- •Автоматизация сборки приложений с помощью make
- •Создание процессов, системные вызовы fork и exec(см.Файлик)
- •Процессы демоны, создание процессов демонов Демоны и потоки
- •Структуры данных процесса
- •Идентификационные данные процесса
- •Контекст процесса
- •Состояния процессов
- •Другие параметры процесса
- •Режимы выполнения процессов
- •Средства межпроцессорного взаимодействия
- •Методы межпроцессного взаимодействия
- •[Править]Реализации
- •Проблемы межпроцессного взаимодействия
- •Обмен информацией между процессами
- •Сигналы
- •Разделяемая память
- •Семафоры, системные вызовы для работы с семафорами
- •Семафоры
- •3.1. Использование семафоров
- •3.2. Создание множеств семафоров
- •3.3. Управление семафорами
- •3.3.1. Использование semctl
- •Очереди сообщений, системные вызовы для работы с очередями сообщений
- •2.1. Использование очередей сообщений
- •2.2. Создание очередей сообщений
- •2.2.1. Использование msgget
- •Разделяемая память, системные вызовы для работы с разделяемой памятью
- •4.1. Использование разделяемых сегментов памяти
- •4.2. Создание разделяемых сегментов памяти
- •4.3. Управление разделяемыми сегментами памяти
- •4.3.1. Использование shmctl
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 требуется право на изменение, а для выполнения остальных действий - право на чтение.