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

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

Жанры

Основы программирования в Linux
Шрифт:

struct sembuf {

 short sem_num;

 short sem_op;

 short sem_flg;

}

Первый параметр

sem_num
— номер семафора, обычно 0, если вы не работаете с массивом семафоров. Элемент
sem_op
— значение, на которое должен изменяться семафор. (Вы можете увеличивать и уменьшать семафор на значения, не равные 1.) Как правило, применяются только два значения: -1
для операции
P
, заставляющей ждать, пока семафор не станет доступен, и +1 для операции
V
, оповещающей о том, что в данный момент семафор доступен.

Последний элемент

sem_flg
обычно задается равным
SEM_UNDO
. Это значение заставляет операционную систему отслеживать изменения значения семафора, сделанные текущим процессом, и, если процесс завершается, не освободив семафор, позволяет операционной системе автоматически освободить семафор, если он удерживался этим процессом. Хорошо взять за правило установку
sem_flg
, равным
SEM_UNDO
, если вам не требуется иного поведения. Если же вы все-таки решили, что вам нужно значение, отличное от
SEM_UNDO
, очень важно быть последовательным, иначе вы можете оказаться в замешательстве относительно попыток ядра системы "убрать" ваши семафоры, когда ваш процесс завершается.

Все действия, предусмотренные

semop
, собраны вместе, чтобы избежать состояния гонок, вызванного использованием множественных семафоров. Все подробности функционирования
semop
можно найти на страницах интерактивного справочного руководства.

semctl

Функция

semctl
позволяет напрямую управлять данными семафора.

int semctl (int sem_id, int sem_num, int command, ...);

Первый параметр sem_id — идентификатор семафора, полученный от функции

semget
. Параметр
sem_num
— номер семафора. Он применяется при работе с массивом семафоров. Обычно этот параметр равен 0, первый и единственный семафор. Параметр
command
— предпринимаемое действие, и четвертый параметр, если присутствует, —
union
(объединение) типа
semun
, которое в соответствии со стандартом X/Open должно содержать как минимум следующие элементы:

union semun {

 int val;

 struct semid_ds *buf;

 unsigned short *array;

}

В большинстве версий ОС Linux определение объединения

semun
включено в заголовочный файл (обычно sem.h), несмотря на то, что стандарт X/Open настаивает на том, что вы должны привести собственное объявление. Если вы поймете, что должны объявить его самостоятельно, проверьте, нет ли объявления этого объединения на страницах интерактивного справочного руководства, относящихся к функции
semctl
. Если вы найдете его, мы полагаем, что вы примените определение из вашего справочного руководства, даже если оно отличается от приведенного на страницах этой книги.

Существует множество

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

Два часто используемых значения

command
таковы:

 

SETVAL
— применяется для инициализации семафора с заданным значением. Это значение передается как элемент
val
объединения
semun
. Такое действие необходимо для того, чтобы увеличить значение семафора перед первым его применением;

 

IPC_RMID
— применяется для удаления идентификатора семафора, когда он больше не нужен.

Функция

semctl
возвращает разные значения, зависящие от параметра
command
. Если значение команды —
IPC_RMID
, функция в случае успешного завершения вернет 0 и -1 в противном случае.

Применение семафоров

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

К счастью, большинство задач, нуждающихся в семафорах, можно решить, применяя единственный бинарный семафор — простейший тип семафора. В следующем примере (упражнение 14.1) вы используете полный программный интерфейс для создания очень простого интерфейса типа Р и V для бинарного семафора. Затем вы примените этот простенький интерфейс для демонстрации того, как функционируют семафоры.

В экспериментах с семафорами будет использоваться единственная программа sem1.с, которую вы сможете запускать несколько раз. Необязательный параметр будет применяться для того, чтобы показать, отвечает ли программа за создание и уничтожение семафора.

Вывод двух разных символов будет обозначать вход в критическую секцию и выход из нее. Программа, запущенная с параметром, выводит

X
при входе в критическую секцию и выходе из нее. Другие экземпляры запущенной программы будут выводить символ
О
при входе в свои критические секции и выходе из них. Поскольку в любой заданный момент времени только один процесс способен войти в свою критическую секцию, все символы
X
и
O
должны появляться парами.

Упражнение 14.1. Семафоры

1. После системных директив

#include
вы включаете файл semun.h. Он определяет объединение типа
semun
в соответствии со стандартом X/Open, если оно уже не описано в системном файле sys/sem.h. Далее следуют прототипы функций и глобальная переменная, расположенные перед входом в функцию
main
. В ней создается семафор с помощью вызова
semget
, который возвращает ID семафора. Если программа вызывается первый раз (т.е. вызывается с параметром и
argc > 1
), выполняется вызов
set_semvalue
для инициализации семафора и переменной
op_char
присваивается значение
O
.

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

Нам здесь (не) жить

Зонин Сергей
2. Насуверс
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Нам здесь (не) жить

Божественные исцеляющие омолаживающие настрои

Сытин Георгий Николаевич
Научно-образовательная:
психология
медицина
7.86
рейтинг книги
Божественные исцеляющие омолаживающие настрои

Нож сновидений

Джордан Роберт
11. Колесо Времени
Фантастика:
фэнтези
8.67
рейтинг книги
Нож сновидений

Уникум Потеряева

Соколовский Владимир Григорьевич
Проза:
современная проза
5.00
рейтинг книги
Уникум Потеряева

Заветы Ильича. «Сим победиши»

Логинов Владлен Терентьевич
Научно-образовательная:
история
политика
6.25
рейтинг книги
Заветы Ильича. «Сим победиши»

Искатель приключений

де Монтепен Ксавье
Приключения:
исторические приключения
6.25
рейтинг книги
Искатель приключений

Избранные произведения в 2-х томах. Том 1

Собко Вадим Николаевич
Проза:
роман
советская классическая проза
5.00
рейтинг книги
Избранные произведения в 2-х томах. Том 1

Звезды над Самаркандом

Бородин Сергей Петрович
Проза:
историческая проза
7.50
рейтинг книги
Звезды над Самаркандом

Жизнь внутри Наруто

Василенко Александр Владимирович
1. Жизнь внутри Наруто
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Жизнь внутри Наруто

МИФЫ. Великолепный МИФ (сборник)

Асприн Роберт Линн
Мифология
Фантастика:
юмористическое фэнтези
8.76
рейтинг книги
МИФЫ. Великолепный МИФ (сборник)

"КАТРИОНА", ГОД 3217. КОСМИЧЕСКАЯ ЛЕТОПИСЬ (Главы 1 - 12)

Талагаева Веда Георгиевна
Фантастика:
научная фантастика
5.00
рейтинг книги
КАТРИОНА, ГОД 3217. КОСМИЧЕСКАЯ ЛЕТОПИСЬ (Главы 1 - 12)

Властитель темных небес

Синклер Шериз
3. Властители Тёмных Небес
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Властитель темных небес

Вечный Герой (сборник)

Муркок Майкл Джон
Шедевры фантастики
Фантастика:
эпическая фантастика
6.25
рейтинг книги
Вечный Герой (сборник)

Отморозок 1

Поповский Андрей Владимирович
1. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 1