SEMCTL(2) SEMCTL(2) НАЗВАНИЕ semctl - операции управления семафорами СИНТАКСИС |#include |#include |#include | |int semctl (semid, semnum, cmd, arg) |int semid, semnum, cmd; |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 присваивается код ошибки.@