ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 65
- 66
- 67
- 68
- 69
- …
- следующая ›
- последняя »