[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Управление семафорами
semctl(2) выполняет действия по управлению наборами семафоров и
одиночными семафорами из набора. Аргументы semctl(2):
semid идентификатор, полученный от semget(2)
semnum индекс семафора в наборе. Первый семафор в наборе имеет
индекс 0.
cmd команда. Возможные значения этого аргумента обсуждаются
на следующей странице.
arg тип этого параметра зависит от команды cmd. Это может
быть:
. Целое число, задающее новое значение семафора
. Указатель на массив беззнаковых коротких целых,
используемый для установки и получения значения всех
семафоров в наборе.
. Указатель на информационную структуру semid_ds для
набора семафоров.
bsys/sem.h:
struct semid_ds {
struct ipc_permsem_perm;/* operation permission
struct */
struct semsem_base;/* ptr to first semaphore in set
*/
ushortsem_nsems;/* # of semaphores in set */
time_tsem_otime;/* last semop time */
longsem_otimfrac;/* reserved for time_t expansion */
time_tsem_ctime;/* last change time */
longsem_ctimfrac;
longpad[4]; /* reserve area */
};
Системный параметр SEMVMX - это наибольшее значение, которое может
быть присвоено семафору вызовом semctl(2) с командами SETVAL и
SETALL. Значение по умолчанию (оно же максимальное) 32767.
intro(2) содержит дополнительную информацию о структурах данных,
используемых для работы с семафорами. Кроме того, можно получить
справки в файлах <sys/ipc.h> и <sys/sem.h>.
УПРАВЛЕНИЕ СЕМАФОРАМИ
semctl(2)
ИМЯ
semctl - действия по управлению семафорами.
ИСПОЛЬЗОВАНИЕ
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
union semun {
int val;
struct semid_ds *buf;
ushort *array;
};
int semctl (int semid, int semnum, int cmd, union
semun arg);
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
GETVAL - значение семафора
GETPID - идентификатор процесса, совершившего последнюю
операцию над семафором
GETNCNT - количество процессов, ожидающих увеличения
значения семафора по сравнению с текущим значением
GETZCNT - количество процессов, ожидающих нулевого значения
семафора
неуспех - -1 и errno установлена