К счастью, большинство задач, нуждающихся в семафорах, можно решить, применяя единственный бинарный семафор — простейший тип семафора. В следующем примере (упражнение 14.1) вы используете полный программный интерфейс для создания очень простого интерфейса типа Р и V для бинарного семафора. Затем вы примените этот простенький интерфейс для демонстрации того, как функционируют семафоры.
В экспериментах с семафорами будет использоваться единственная программа sem1.с, которую вы сможете запускать несколько раз. Необязательный параметр будет применяться для того, чтобы показать, отвечает ли программа за создание и уничтожение семафора.
Вывод двух разных символов будет обозначать
вход в критическую секцию и выход из нее. Программа, запущенная с параметром, выводит
X
при входе в критическую секцию и выходе из нее. Другие экземпляры запущенной программы будут выводить символ
О
при входе в свои критические секции и выходе из них. Поскольку в любой заданный момент времени только один процесс способен войти в свою критическую секцию, все символы
X
и
O
должны появляться парами.
Упражнение 14.1. Семафоры
1. После системных директив
#include
вы включаете файл semun.h. Он определяет объединение типа
semun
в соответствии со стандартом X/Open, если оно уже не описано в системном файле sys/sem.h. Далее следуют прототипы функций и глобальная переменная, расположенные перед входом в функцию
main
. В ней создается семафор с помощью вызова
semget
, который возвращает ID семафора. Если программа вызывается первый раз (т.е. вызывается с параметром и