26.6.1. Создание множества семафоров
26.6.1. Создание множества семафоров
Для создания множества семафоров или подключения к уже существующему множеству используется системный вызов semget():
int semget(key_t key, int nsems, int semflg);
Первый аргумент — это ключ IPC, который, как обычно, создается системным вызовом ftok(). Он сравнивается с ключами других семафоров и в зависимости от значения semflg решается, создавать новое множество или подключиться к уже существующему. Значение semflg:
? IPC_CREAT — создать новое множество семафоров;
? IPC_EXCL — при использовании с IPC_CREAT порождает ошибку, если семафор уже существует.
При создании семафора, как и при создании очереди сообщений, мы можем указать права доступа:
IPC_CREAT | 0660
Второй аргумент системного вызова semget() задает требуемое количество семафоров. Оно ограничено в файле sem.h:
#define SEMMSL 32 /* <= 512 */
Данный аргумент игнорируется, если вы подключаетесь к уже существующему множеству, а не создаете новое.
Функция semget() возвращает идентификатор семафора или -1 в случае ошибки. Переменная errno устанавливается следующим образом:
? EACCESS — у вас не хватает полномочий для выполнения операции;
? EEXISTS — множество существует, его нельзя создать;
? EIDRM — множество помечено для удаления;
? ENOENT — множество не существует, не было ни одной операции IPC_CREAT;
? ENOMEM — не хватает памяти;
? ENOSPC — достигнуто максимальное количество семафоров.
Функция для открытия существующего семафора может выглядеть так:
void open_sem(int *sid, key_t key) {
if ((*sid = semget(key, 0, 0666)) == -1) {
printf("Семафор не существует !!!! ");
exit(1);
}
}
Для создания множества семафоров можно использовать следующую функцию:
void create_sem(int *sid, key_t key, int n) {
int c=0; /* счетчик */
union semun sems;
if (n > SEMMSL) {
printf("Превышен лимит. Максимальное число семафоров %d ", SEMMSL);
exit(1);
}
if ((*sid =
semget(key, n, IPC_CREAT|IPC_EXCL|0666)) == -1) {
printf("Множество уже существует ");
exit(1);
}
sems.val = SEM_RESOURCE_MAX;
/* Инициализируем все элементы одним значением */
semctl(*sid, c, SETALL, sems);
/* Если нужно установить разные значения,
нужно использовать SETVAL, например
for (c=0; c<n; c++)
semctl(*sid, c, SETVAL, sems);
*/
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Использование семафоров
Использование семафоров Классической областью применения семафоров является управление распределением конечных ресурсов, когда значение счетчика семафора ассоциируется с определенным количеством доступных ресурсов, например, количеством сообщений, находящихся в
Ограниченность семафоров
Ограниченность семафоров В Windows существуют важные ограничения, касающиеся реализации семафоров. Например, каким образом поток может потребовать, чтобы счетчик семафора уменьшился на 2? Для этого поток мог бы организовать ожидание два раза подряд, как показано ниже, но
Создание и инициализация семафоров
Создание и инициализация семафоров Реализация семафоров зависит от аппаратной платформы и определена в файле <asm/semaphore.h>. Структура struct semaphore представляет объекты типа семафор. Статическое определение семафоров выполняется следующим образом.static DECLARE_SEMAPHORE_GENERIC(name,
Использование семафоров
Использование семафоров Функция down_interruptible() выполняет попытку захватить данный семафор. Если эта попытка неудачна, то задание переводится в состояние ожидания с флагом TASK_INTERRUPTIBLE. Из материала главы 3 следует вспомнить, что такое состояние процесса означает, что задание
12.3.1 Определение семафоров
12.3.1 Определение семафоров Семафор представляет собой обрабатываемый ядром целочисленный объект, для которого определены следующие элементарные (неделимые) операции:• Инициализация семафора, в результате которой семафору присваивается неотрицательное значение;•
12.3.2 Реализация семафоров
12.3.2 Реализация семафоров Дийкстра [Dijkstra 65] показал, что семафоры можно реализовать без использования специальных машинных инструкций. На Рисунке 12.6 представлены реализующие семафоры функции, написанные на языке Си. Функция Pprim блокирует семафор по результатам проверки
11.7. Ограничения семафоров System V
11.7. Ограничения семафоров System V На семафоры System V накладываются определенные системные ограничения, так же, как и на очереди сообщений. Большинство этих ограничений были связаны с особенностями реализации System V (раздел 3.8). Они показаны в табл. 11.1. Первая колонка содержит
4.4.3. Взаимоблокировки исключающих семафоров
4.4.3. Взаимоблокировки исключающих семафоров Исключающие семафоры являются механизмом, позволяющим одному потоку блокировать выполнение другого потока. Это приводит к возникновению нового класса ошибок. называемых взаимоблокировками или тупиковыми ситуациями. Смысл
5.2.1. Выделение и освобождение семафоров
5.2.1. Выделение и освобождение семафоров Функции semget() и semctl() выделяют и освобождают семафоры, функционируя подобно функциям shmget() и shmctl(). Первым аргументом функции semget() является ключ, идентифицирующий группу семафоров; второй аргумент — это число семафоров в группе;
5.2.2. Инициализация семафоров
5.2.2. Инициализация семафоров Выделение и инициализация семафора — две разные операции. Чтобы проинициализировать семафор, вызовите функцию semctl(), задав второй аргумент равным нулю, а третий аргумент — равным константе SETALL. Четвертый аргумент должен иметь тип union semun, поле
5.2.4. Отладка семафоров
5.2.4. Отладка семафоров С помощью команды ipcs -s можно получить информацию о существующих группах семафоров. Команда ipcrm sem позволяет удалить заданную группу, например:% ipcrm sem