Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 67 стр.

UptoLike

Составители: 

67
Первый аргумент semget() - это ключ. Он сравнивается с ключами остальных
множеств семафоров, присутствующих в системе. Вместе с этим решается вопрос о
выборе между созданием и подключением к множеству семафоров в зависимости от
аргумента semflg. Возможные значения:
IPC_CREAT Создает множество семафоров, если его еще не было в системе;
IPC_EXCL При использовании вместе с IPC_CREAT вызывает ошибку, если
семафор уже существует.
Если IPC_CREAT используется в одиночку, то semget() возвращает
идентификатор множества семафоров - вновь созданного или с таким же ключом. Если
IPC_EXCL используется совместно с IPC_CREAT, то либо создается новое множество,
либо, если оно уже существует, вызов приводит к ошибке и -1. Сам по себе IPC_EXCL
бесполезен, но вместе с IPC_CREAT он дает средство гарантировать, что ни одно из
существующих множеств семафоров не открыто для доступа.
Аргумент nsems определяет число семафоров, которых требуется породить в
новом множестве. Максимальное число семафоров определяется в "linux/sem.h":
#define SEMMSL 32 /* <= 512 */
Аргумент nsems игнорируется, если вы открвываете существующую очередь.
int semop( int semid, struct sembuf *sops, unsigned nsops)
Функция возвращает 0 в случае успешного выполнения, -1 - в случае ошибки.
Переменная errno может принимать следующие значения:
E2BIG nsops больше чем максимальное число позволенных операций;
EACCESS доступ отклонен;
EAGAIN при установленном флаге IPC_NOWAIT операция не может быть
выполнена;
EFAULT sops указывает на ошибочный адрес;
EIDRM множество семафоров уничтожено;
EINTR сигнал получен во время сна;
EINVAL множество не существует или неверный semid;
ENOMEM поднят флаг SEM_UNDO, но не хватает памяти для создания
необходимой undo-структуры;
ERANGE значение семафора вышло за пределы допустимых значений.
Первый аргумент semop() есть значение ключа (в нашем случае возвращается
semget). Второй аргумент (sops) - это указатель на массив операций, выполняемых над
семафорами, третий аргумент (nsops) является количеством операций в этом массиве.
Аргумент sops указывает на массив типа sembuf. Эта структура описана в linux/sem.h
следующим образом:
/* системный вызов semop требует массив таких структур */
struct sembuf {
ushort sem_num; /* индекс семафора в массиве */
short sem_op; /* операция над семафором */
short sem_flg; /* флаги */
};
sem_num Номер семафора, с которым вы собираетесь иметь дело;
sem_op Выполняемая операция (положительное, отрицательное число или
нуль);
sem_flg Флаги операции.
Если sem_op отрицателен, то его значение вычитается из семафора (семафор
уменьшается - перев.). Это соответствует получению ресурсов, которые контролирует
семафор. Если IPC_NOWAIT не установлен, то вызывающий процесс засыпает, пока
семафор не выдаст требуемое количество ресурсов (пока другой процесс не освободит
их).
        Первый аргумент semget() - это ключ. Он сравнивается с ключами остальных
множеств семафоров, присутствующих в системе. Вместе с этим решается вопрос о
выборе между созданием и подключением к множеству семафоров в зависимости от
аргумента semflg. Возможные значения:
IPC_CREAT          Создает множество семафоров, если его еще не было в системе;
IPC_EXCL           При использовании вместе с IPC_CREAT вызывает ошибку, если
                   семафор уже существует.
        Если IPC_CREAT используется в одиночку, то semget() возвращает
идентификатор множества семафоров - вновь созданного или с таким же ключом. Если
IPC_EXCL используется совместно с IPC_CREAT, то либо создается новое множество,
либо, если оно уже существует, вызов приводит к ошибке и -1. Сам по себе IPC_EXCL
бесполезен, но вместе с IPC_CREAT он дает средство гарантировать, что ни одно из
существующих множеств семафоров не открыто для доступа.
        Аргумент nsems определяет число семафоров, которых требуется породить в
новом множестве. Максимальное число семафоров определяется в "linux/sem.h":
       #define SEMMSL    32 /* <= 512 */
       Аргумент nsems игнорируется, если вы открвываете существующую очередь.
       int semop( int semid, struct sembuf *sops, unsigned nsops)
        Функция возвращает 0 в случае успешного выполнения, -1 - в случае ошибки.
Переменная errno может принимать следующие значения:
E2BIG            nsops больше чем максимальное число позволенных операций;
EACCESS          доступ отклонен;
EAGAIN           при установленном флаге IPC_NOWAIT операция не может быть
                 выполнена;
EFAULT           sops указывает на ошибочный адрес;
EIDRM            множество семафоров уничтожено;
EINTR            сигнал получен во время сна;
EINVAL           множество не существует или неверный semid;
ENOMEM           поднят флаг SEM_UNDO, но не хватает памяти для создания
                 необходимой undo-структуры;
ERANGE           значение семафора вышло за пределы допустимых значений.
        Первый аргумент semop() есть значение ключа (в нашем случае возвращается
semget). Второй аргумент (sops) - это указатель на массив операций, выполняемых над
семафорами, третий аргумент (nsops) является количеством операций в этом массиве.
Аргумент sops указывает на массив типа sembuf. Эта структура описана в linux/sem.h
следующим образом:
       /* системный вызов semop требует массив таких структур */
       struct sembuf {
          ushort sem_num;   /* индекс семафора в массиве */
          short sem_op;     /* операция над семафором */
          short sem_flg;    /* флаги */
       };
sem_num         Номер семафора, с которым вы собираетесь иметь дело;
sem_op          Выполняемая операция (положительное, отрицательное число или
                нуль);
sem_flg         Флаги операции.
        Если sem_op отрицателен, то его значение вычитается из семафора (семафор
уменьшается - перев.). Это соответствует получению ресурсов, которые контролирует
семафор. Если IPC_NOWAIT не установлен, то вызывающий процесс засыпает, пока
семафор не выдаст требуемое количество ресурсов (пока другой процесс не освободит
их).


                                                                                67