Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

Системный вызов semctl Описание

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.

Одно из важных применений функции setval заключается в установке начальных значений семафоров, так как вызов semget не позволяет процессу сделать это. Приведенная в качестве примера функция initsem может использоваться для создания одиночного семафора и получения связанного с ним идентификатора набора семафоров. После создания семафора (если семафор еще не существовал) функция semctl присваивает ему начальное значение, равное единице.

{$i pv.inc}

(* Функция initsem - инициализация семафора *)

function initsem(semkey:tkey):longint;

var

status, semid:longint;

arg:tsemun;

begin

status := 0;

semid := semget (semkey, 1,

SEMPERM or IPC_CREAT or IPC_EXCL);

if semid = -1 then

begin

if ipcerror = Sys_EEXIST then

semid := semget (semkey, 1, 0);

end

else

(* если семафор создается ... *)

begin

arg.val := 1;

status := semctl (semid, 0, SETVAL, arg);

end;

if (semid = -1) or (status = -1) then

begin

perror ('ошибка вызова initsem');

initsem:=-1;

exit;

end;

(* Все в порядке *)

initsem:=semid;

end;

Включаемый файл pv.inc содержит следующие определения:

(* Заголовочный файл для примера работы с семафорами *)

const

SEMPERM=6 shl 6{0600};

Функция initsem будет использована в примере следующего раздела.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal