Руководство программиста для Linux


Семафоры - часть 6


Берет структуру semid_ds для множества и запоминает ее по адресу аргумента buf в объединении semun.

IPC_SET

Устанавливает значение элемента ipc_perm структуры semid_ds для множества.

IPC_RMID

Удаляет множество из ядра.

GETALL

Используется для получения значений всех семафоров множества. Целые значения запоминаются в массиве элементов unsigned short, на который указывает член объединения array.

GETNCNT

Выдает число процессов, ожидающих ресурсов в данный момент.

GETPID

Возвращает PID процесса, выполнившего последний вызов semop.

GETVAL

Возвращает значение одного семафора из множества.

GETZCNT

Возвращает число процессов, ожидающих стопроцентного освобождения ресурса.

SETALLM

Устанавливает значения семафоров множества, взятые из элемента array объединения.

SETVAL

Устанавливает значение конкретного семафора множества как элемент val объединения.

Аргумент arg вызова semсtl() является примером объединения semun, описанного в linux/sem.h следующим образом: /* аргумент arg для системного вызова semctl */ union semun { int val; /* значение для SETVAL-а */ struct semid_ds *buf; /* буфер для IPC_STAT и IPC_SET */ ushort *array; /* массив для GETALL и SETALL */ struct seminfo *__buf; /* буфер для IPC_INFO */ void *__pad; };

val

Определяет значение, в которое устанавливается семафор командой SETVAL.

buf

Используется командами IPC_STAT/IPC_SET. Представляет копию внутренней структуры данных семафора, находящейся в ядре.

array

Указатель для команд GETALL/SETALL. Ссылается на массив целых, используемый для установки или получения всех значений семафоров в множестве.

Оставшиеся аргументы __buf и __pad предназначены для ядра и почти, а то и вовсе не нужны разработчику приложения. Эти два аргумента специфичны для LINUX-а, их нет в других системах UNIX-а.

Поскольку этот особенный системный вызов наиболее сложен для восприятия среди всех системных вызовов System V IPC, мы рассмотрим несколько его примеров в действии.

Следующий отрывок выдает значение указанного семафора. Последний аргумент (объединение) игнорируется, если используется команда GETVAL. int get_sem_val( int sid, int semnum ) { return( semctl(sid, semnum, GETVAL, 0)); }




Начало  Назад  Вперед



Книжный магазин