SEMCTL(2) SEMCTL(2)
НАЗВАНИЕ
semctl - операции управления семафорами
СИНТАКСИС
#include
#include
#include
int semctl (semid, semnum, cmd, arg)
int semid, cmd;
int semnum;
union semun {
int val;
struct semid_ds *buf;
ushort *array;
} arg;
ОПИСАНИЕ
Системный вызов semctl позволяет выполнять операции уп-
равления семафорами. Семафоры задаются аргументами
semid и semnum. Операция определяется значением аргу-
мента cmd, которое должно быть одним из следующих:
GETVAL
Получить значение семафора semval [см. intro(2)].
{Требуется право на чтение.}
SETVAL
Установить значение семафора semval равным
arg.val. {Требуется право на изменение.} После ус-
пешного выполнения этой команды значение semadj,
соответствующее заданному семафору во всех процес-
сах, устанавливается равным 0.
GETPID
Получить значение sempid. {Требуется право на чте-
ние.}
GETNCNT
Получить значение semncnt. {Требуется право на
чтение.}
GETZCNT
Получить значение semzcnt. {Требуется право на
чтение.}
Следующие команды cmd читают и устанавливают значение
каждого семафора в множестве семафоров:
GETALL
Прочитать значения семафоров в массив, на который
указывает arg.array. {Требуется право на чтение.}
SETALL
Установить значения семафоров равными значениям
элементов массива, на который указывает arg.array.
{Требуется право на изменение.} После успешного
выполнения этой команды значения semadj, соот-
ветствующие заданным семафорам во всех процессах,
устанавливаются равными 0.
Предоставляются также следующие команды:
IPC_STAT
Поместить текущее значение каждого поля структуры
данных, ассоциированной с идентификатором semid, в
структуру, на которую указывает arg.buf. Содержи-
мое этой структуры определяется в intro(2). {Тре-
буется право на чтение.}
IPC_SET
Присвоить следующим полям структуры данных, ассо-
циированной с идентификатором semid, соответствую-
щие значения, находящиеся в структуре, на которую
указывает arg.buf:
sem_perm.uid
sem_perm.gid
sem_perm.mode /* Только младшие 9 бит */
Эта команда может выполняться только процессом,
который имеет действующий идентификатор пользова-
теля, равный либо идентификатору суперпользовате-
ля, либо значению поля sem_perm.cuid или
sem_perm.uid в структуре данных, ассоциированной с
идентификатором semid.
IPC_RMID
Удалить из системы идентификатор семафора, опреде-
ляемый значением semid, ликвидировать множество
семафоров и ассоциированную с ним структуру дан-
ных. Эта команда может выполняться только процес-
сом, который имеет действующий идентификатор поль-
зователя, равный либо идентификатору суперпользо-
вателя, либо значению поля sem_perm.cuid или
sem_perm.uid в структуре данных, ассоциированной с
идентификатором semid.
Системный вызов semctl завершается неудачей, если вы-
полнено хотя бы одно из следующих условий:
[EINVAL] Значение аргумента semid не является кор-
ректным идентификатором множества семафо-
ров.
[EINVAL] Номер семафора semnum меньше 0 или превыша-
ет значение sem_nsems.
[EINVAL] Некорректное значение аргумента cmd, опре-
деляющее команду.
[EACCES] Нет прав на выполнение операции у вызываю-
щего процесса.
[ERANGE] Значение аргумента cmd равно SETVAL или
SETALL и значение, которое присваивается
семафору, больше максимально допустимого в
системе.
[EPERM] Значение аргумента cmd равно IPC_RMID или
IPC_SET и действующий идентификатор пользо-
вателя вызывающего процесса не равен ни
идентификатору суперпользователя, ни значе-
нию поля sem_perm.cuid или sem_perm.uid в
структуре данных, ассоциированной с иденти-
фикатором semid.
[EFAULT] Значение arg.buf указывает за пределы отве-
денного процессу адресного пространства.
СМ. ТАКЖЕ
intro(2), semget(2), semop(2).
ДИАГНОСТИКА
При успешном завершении системного вызова возвращаются
следующие значения, в зависимости от команды cmd:
GETVAL Значение семафора semval.
GETPID Идентификатор процесса sempid.
GETNCNT Значение semncnt.
GETZCNT Значение semzcnt.
Результат успешного выполнения остальных операций равен
0.
В случае ошибки возвращается -1, а переменной errno
присваивается код ошибки.
|