SEMCTL(2)
НАЗВАНИЕ
semctl - операции управления семафорами
СИНТАКСИС
#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 позволяет выполнять операции управления семафорами. Семафоры задаются аргументами
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
присваивается код ошибки.