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

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

Жанры

Основы программирования в 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
.

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

Девять драконов

Скотт Джастин
Детективы:
триллеры
5.00
рейтинг книги
Девять драконов

Полигон

Гостева Ирина
S.T.A.L.K.E.R.
Фантастика:
боевая фантастика
7.78
рейтинг книги
Полигон

Двойник Короля 7

Скабер Артемий
7. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 7

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Папина дочка

Рам Янка
4. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Папина дочка

Хозяин Стужи 5

Петров Максим Николаевич
5. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
6.60
рейтинг книги
Хозяин Стужи 5

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Эпоха Опустошителя. Том II

Павлов Вел
2. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том II

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Великие мифы и легенды. 100 историй о подвигах, мире богов, тайнах рождения и смерти

Мудрова Ирина Анатольевна
Старинная литература:
мифы. легенды. эпос
5.00
рейтинг книги
Великие мифы и легенды. 100 историй о подвигах, мире богов, тайнах рождения и смерти

Двойник короля 15

Скабер Артемий
15. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 15

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия