Книга: UNIX: взаимодействие процессов
11.4. Функция semctl
11.4. Функция semctl
Функция semctl предназначена для выполнения разного рода вспомогательных управляющих операций с семафорами.
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, …/* union semun arg */);
/* Возвращает неотрицательное значение в случае успешного завершения (см. в тексте). –1 – в случае ошибки */
Первый аргумент (semid) представляет собой идентификатор семафора, a semnum указывает элемент набора семафоров (0, 1 и т. д. до nsems –1). Значение semnum используется только командами GETVAL, SETVAL, GETNCNT, GETZCNT и GETPID.
Четвертый аргумент является дополнительным — он добавляется в зависимости от команды cmd (см. комментарии в описании объединения). Объявляется это объединение следующим образом:
union semun {
int val; /* используется только командой SETVAL */
struct semid_ds *buf; /* используется командами IPC_SET и IPC_STAT */
ushort *array; /* используется командами GETALL и SETALL */
};
Это объединение отсутствует в системных заголовочных файлах и должно декларироваться приложением (мы определяем его в заголовочном файле unpipc.h, листинг B.1). Оно передается по значению, а не по ссылке, то есть аргументом является собственно значение объединения, а не указатель на него.
ПРИМЕЧАНИЕ
К сожалению, в некоторых системах (FreeBSD и Linux) это объединение определено в заголовочном файле <sys/sem.h>, что затрудняет написание переносимых программ. Хотя в объявлении этого объединения в системном заголовочном файле и есть некоторый смысл, стандарт Unix 98 требует, чтобы оно каждый раз явно объявлялось приложением.
Ниже приведен список поддерживаемых значений аргумента cmd. В случае успешного завершения функция возвращает 0, а в случае ошибки – –1, если в описании команды не сказано что-либо другое.
? GETVAL — возвращает текущее значение semval. Поскольку значение семафора отрицательным быть не может (semval объявляется как unsigned short — беззнаковое короткое целое), в случае успешного возврата значение всегда будет неотрицательным.
? SETVAL — установка значения semval равным arg.val. В случае успешного выполнения корректировочное значение этого семафора (semadj) устанавливается равным нулю для всех процессов.
? GETPID — функция возвращает текущее значение поля sempid.
? GETNCNT — функция возвращает текущее значение поля semncnt.
? GETZCNT — функция возвращает текущее значение поля semzcnt.
? GETALL — возвращаются значения semval для всех элементов набора. Значения возвращаются через указатель arg.array, а сама функция при этом возвращает 0. Обратите внимание, что вызывающий процесс должен самостоятельно выделить массив беззнаковых коротких целых достаточного объема для хранения всех значений семафоров набора, а затем сделать так, чтобы arg.array указывал на этот массив.
? SETALL — установка значений semval для всех элементов набора. Значения задаются через указатель arg.array.
? IPC_RMID — удаление набора семафоров, задаваемого через идентификатор semid.
? IPC_SET — установка трех полей структуры semid_ds равными соответствующим полям структуры arg.buf: sem_perm.uid, sem_perm.gid и sem_perm.mode. Поле sem_ctime структуры semid_ds устанавливается равным текущему времени.
? IPC_STAT — возвращение вызвавшему процессу через аргумент arg.buf текущего значения полей структуры semid_ds для данного набора семафоров. Обратите внимание, что вызывающий процесс должен сначала выделить место под структуру semid_ds и установить на нее указатель arg.buf.
- Функция sem_getvalue
- Функция sem_open
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- Функция strcmp( )
- Управление функциями узла
- Функция программного обеспечения
- 3.2. Ключи типа key_t и функция ftok
- 9.10. Функция sctp_recvmsg
- Функция document
- Функция generate-id