uses ipc;
Function semctl(semid:longint; sem_num:longint; command:longint;
var ctl_arg:tsemun):longint;
Из определения видно, что функция semctl намного сложнее, чем msgctl. Параметр semid должен быть допустимым идентификатором семафора, возвращенным вызовом semget. Параметр command имеет тот же смысл, что и в вызове msgctl,
– задает требуемую команду. Команды распадаются на три категории: стандартные команды управления средством межпроцессного взаимодействия (такие как IPC_STAT); команды, которые воздействуют только на один семафор; и команды, действующие на весь набор семафоров. Все доступные команды приведены в табл. 8.1.
Таблица 8.1. Коды функций вызова semctl
Стандартные функции межпроцессного взаимодействия
IPC_STAT Поместить информацию о статусе в поле ctl_arg.stat
IPC_SET Установить данные о владельце/правах доступа
IPC_RMID Удалить набор семафоров из системы
Операции над одиночными семафорами
(относятся к семафору sem_num, значение возвращается вызовом semctl)
GETVAL Вернуть значение семафора (то есть setval)
SETVAL Установить значение семафора равным ctl_arg.val
GETPID Вернуть значение sempid
GETNCNT Вернуть semncnt (см. выше)
GETZCNT Вернуть semzcnt (см. выше)
Операции над всеми семафорами
GETALL Поместить все значения setval в массив ctl_arg.array
SETALL Установить все значения setval из массива ctl_arg.array
Параметр sem_num используется со второй группой возможных операций вызова semctl для задания определенного семафора. Последний параметр ctl_arg является объединением
(записью с вариантами), определенным следующим образом:
PSEMun = ^TSEMun;
TSEMun = record
case longint of
0 : (val : longint);
1 : (buf : PSEMid_ds);
2 : (arr : PWord);
3 : (padbuf : PSeminfo);
4 : (padpad : pointer);
end;
Каждый элемент объединения представляет некоторый тип значения, передаваемого вызову semctl при выполнении определенной команды. Например, если значение command равно SETVAL, то будет использоваться элемент ctl_arg.val.