Чтение онлайн

на главную - закладки

Жанры

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

 struct semid_ds *buf;

 unsigned short int* array;

 struct seminfo *__buf;

};

/* Получаем идентификатор семафора и создаем семафор,

если идентификатор оказывается уникальным. */

int binary_semaphore_allocation(key_t key, int sem_flags) {

 return semget(key, 1, sem_flags);

}

/* Освобождаем семафор, подразумевая, что пользователи

больше не работают с ним. В случае ошибки

возвращается -1. */

int binary_semaphore_deallocate(int semid) {

 union semun ignored_argument;

 return semctl(semid, 1, IPC_RMID, ignored_argument}

}

5.2.2. Инициализация семафоров

Выделение и инициализация семафора — две разные операции. Чтобы проинициализировать семафор, вызовите функцию

semctl
, задав второй аргумент равным нулю, а третий аргумент — равным константе
SETALL
. Четвертый аргумент должен иметь тип
union semun
, поле
array
которого указывает на массив значений типа
unsigned short
. Каждое значение инициализирует один семафор из набора.

В листинге 5.3 представлена функция, инициализирующая двоичный семафор.

Листинг 5.3. (sem_init.c) Инициализация двоичного семафора

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

/* Тип union semun необходимо определить самостоятельно. "/

union semun {

 int val;

 struct semid_ds* buf;

 unsigned short int *array;

 struct seminfo *__buf;

};

/* Инициализация двоичного семафора значением 1. */

int binary_semaphore_initialize(int semid) {

 union semun argument;

 unsigned short values(1);

 values[0] = 1;

 argument.array = values;

 return semctl(semid, 0, SETALL, argument);

}

5.2.3. Операции ожидания и установки

Каждый семафор имеет неотрицательное значение и поддерживает операции ожидания и установки. Системный вызов

semop
реализует обе операции. Первым аргументом функции является идентификатор группы семафоров. Второй аргумент — это массив значений типа
struct sembuf
, задающих выполняемые операции. Третий аргумент — это длина массива.

Ниже перечислены поля структуры

sembuf
.

■ 

sem_num
— номер семафора в группе.

■ 

sem_op
— число, задающее операцию.

Если данное поле содержит положительное число, оно немедленно добавляется к значению семафора.

Если данное поле содержит отрицательное число, то модуль числа вычитается из значения семафора. Операции, приводящие к установке отрицательного значения, блокируются до тех пор, пока значение семафора не станет достаточно большим (вследствие действий других процессов).

Если данное поле равно нулю, операция блокируется до тех пор, пока значение семафора не станет равным нулю.

■ 

sem_flg
— это значение флага. Флаг
IPC_NOWAIT
предотвращает блокирование операции. Если запрашиваемая операция приведет к блокированию, функция
semop
завершится выдачей кода ошибки. При наличии флага
SEM_UNDO
ОС Linux автоматически отменит выполненную операцию по завершении процесса.

В листинге 5.4 иллюстрируются операции ожидания и установки двоичного семафора.

Листинг 5.4. (sem_pv.c) Ожидание и установка двоичного семафора

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

/* Ожидание семафора. Операция блокируется до тех пор, пока

значение семафора не станет положительным, после чего

значение уменьшается на единицу. */

int binary_semaphore_wait(int semid) {

 struct sembuf operations[1];

 /* Оперируем одним-единственным семафором. */

 operations[0].sem_num = 0;

 /* Уменьшаем его значение на единицу. */

 operations[0].sem_op = -1;

 /* Разрешаем отмену операции. */

 operations[0].sem_flg = SEM_UNDO;

 return semop(semid, operations, 1);

}

/* Установка семафора: его значение увеличивается на единицу.

Эта операция завершается немедленно. */

int binary_semaphore_post(int semid) {

 struct sembuf operations[1];

 /* оперируем одним-единственным семафором. */

 operations[0].sem_num = 0;

 /* Увеличиваем его значение на единицу. */

 operations[0].sem_op = 1;

 /* Разрешаем отмену операции. */

 operations[0].sem_flg = SEM_UNDO;

Поделиться:
Популярные книги

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Газлайтер. Том 28

Володин Григорий Григорьевич
28. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 28

Первый среди равных. Книга IX

Бор Жорж
9. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IX

Ефрейтор. Назад в СССР. Книга 2

Гаусс Максим
2. Второй шанс
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Ефрейтор. Назад в СССР. Книга 2

Лекарь Империи 4

Карелин Сергей Витальевич
4. Лекарь Империи
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 4

Личный аптекарь императора. Том 4

Карелин Сергей Витальевич
4. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 4

Сержант. Назад в СССР. Книга 4

Гаусс Максим
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Страж Кодекса. Книга III

Романов Илья Николаевич
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III

Господин из завтра. Тетралогия.

Махров Алексей
Фантастика:
альтернативная история
8.32
рейтинг книги
Господин из завтра. Тетралогия.

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Звездная Кровь. Изгой II

Елисеев Алексей Станиславович
2. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой II

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI