Использование semctl
В статье semctl(2) Справочника программиста синтаксис данного системного вызова описан так:
#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(2) в случае успешного завершения зависит от выполняемого управляющего действия. Как правило он равен 0, но четыре действия (GETVAL, GETPID, GETNCNT и GETZCNT) являются исключениями. При возникновении ошибки всегда возвращается -1.
Аргументы semid и semnum определяют множество или отдельный семафор, над которым выполняется управляющее действие. В качестве аргумента semid должен выступать идентификатор множества семафоров, предварительно полученный при помощи системного вызова semget(2). Аргумент semnum задает номер семафора в множестве. Семафоры нумеруются с нуля.
Назначение аргумента arg зависит от управляющего действия, которое определяется значением аргумента cmd. Допустимы следующие действия:
| GETVAL | |
| Получить значение семафора и выдать его в качестве результата. | |
| SETVAL | |
| Установить значение семафора равным arg.val. | |
| GETPID | |
| Получить идентификатор процесса, последним выполнявшего операцию над семафором, и выдать его в качестве результата. | |
| GETNCNT | |
| Получить число процессов, ожидающих увеличения значения семафора, и выдать его в качестве результата. | |
| GETZCNT | |
| Получить число процессов, ожидающих обнуления значения семафора, и выдать его в качестве результата. | |
| GETALL | |
| Прочитать значения всех семафоров множества и поместить их в массив, на который указывает arg.array. | |
| SETALL | |
| Установить значения всех семафоров множества равными значениям элементов массива, на который указывает arg.array. | |
| IPC_STAT | |
| Поместить информацию о состоянии множества семафоров, содержащуюся в структуре данных, ассоциированной с идентификатором semid, в пользовательскую структуру, на которую указывает arg.buf. | |
| IPC_SET | |
| В структуре данных, ассоциированной с идентификатором semid, переустановить значения действующих идентификаторов пользователя и группы, а также прав на операции. Нужные значения извлекаются из структуры данных, на которую указывает arg.buf. | |
| IPC_RMID | |
| Удалить из системы идентификатор semid, ликвидировать множество семафоров и ассоциированную с ним структуру данных. |
Чтобы выполнить управляющее действие IPC_SET или IPC_RMID, процесс должен иметь действующий идентификатор пользователя, равный либо идентификаторам создателя или владельца очереди, либо идентификатору суперпользователя. Для выполнения управляющих действий SETVAL и SETALL требуется право на изменение, а для выполнения остальных действий - право на чтение.