Скачиваний:
90
Добавлен:
12.05.2015
Размер:
913.92 Кб
Скачать

19.4. Функция semctl

Функция semctlпредназначена для выполнения разного рода вспомогательных управляющих операций с семафорами.

#include <sys/sem.h>

int semctl (int semid, int semnum, int cmd, ... /* union semun arg */);

/* возвращает неотрицательное значение в случае успешного завершения, -1 – в случае ошибки */

Первый аргумент (semid) представляет собой идентификатор набора семафоров, аsemnumуказывает элемент набора семафоров (0, 1 и т. д. доsem_nsems-1). Значениеsemnumиспользуется только командамиGETVAL,SETVAL,GETNCNT,GETZCNTиGETPID.

Четвертый аргумент является дополнительным – он добавляется в зависимости от команды cmd(см. комментарии в описании объединения). Объявляется это объединение следующим образом:

union semun

{

int val; /* используется только командой SETVAL */

struct semid_ds *buf; /* используется командами IPC_STAT и IPC_SET */

unsigned short *array; /* используется командами GETALL и SETALL */

};

Это объединение отсутствует в системных заголовочных файлах и должно быть объявлено в программе. Оно передается по значению, а не по ссылке, то есть аргументом является значение собственно объединения, а не указатель на него.

Ниже приведен список поддерживаемых значений аргумента cmd:

  • GETVAL – возвращает текущее значениеsemval. Поскольку значение семафора отрицательным быть не может (semvalимеет типunsignedshort– беззнаковое короткое целое), то в случае успеха возвращаемое значение всегда будет неотрицательным;

  • 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.

Соседние файлы в папке Chapter.4