The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Каталог документации / Раздел "Документация для Linux" / Оглавление документа
next up previous contents index
Next: Программа-пример Up: Управление семафорами Previous: Управление семафорами   Contents   Index

Использование semctl

В справочной статье semctl синтаксис данного системного вызова описан так:

        #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 в случае успешного завершения зависит от выполняемого управляющего действия. Как правило он равен 0, но четыре действия (GETVAL, GETPID, GETNCNT и GETZCNT) являются исключениями. При возникновении ошибки всегда возвращается -1.

Аргументы semid и semnum определяют множество или отдельный семафор, над которым выполняется управляющее действие. В качестве аргумента semid должен выступать идентификатор множества семафоров, предварительно полученный при помощи системного вызова semget. Аргумент 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 требуется право на изменение, а для выполнения остальных действий - право на чтение.



Alex Otwagin 2002-12-16

  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor