- •Процессы и задачи в Microsoft Windows
- •Запуск задач
- •Управление запущенными задачами
- •Изменение приоритета задачи
- •Определение приоритета задачи
- •Приостановка и возобновление выполнения задачи
- •Временная приостановка работы задачи
- •Завершение задачи
- •Освобождение идентификатора задачи
- •Критические секции
- •Инициализация критической секции
- •Удаление критической секции
- •Вход в критическую секцию и выход из нее
- •4. Контрольные вопросы
- •5. Содержание работы
- •Создание объекта - событие
- •Открытие объекта - событие
- •Управление состоянием объекта - событие
- •Объекты – событие с автосбросом
- •Создание объекта Mutex
- •Освобождение идентификатора объекта Mutex
- •Открытие объекта Mutex
- •Как завладеть объектом Mutex
- •Освобождение объекта Mutex
- •Как работает семафор
- •Функции для работы с семафорами
- •Создание семафора
- •Уничтожение семафора •
- •Увеличение значения счетчика семафора
- •Уменьшение значения счетчика семафора
- •Определение текущего значения счетчика семафора
- •Создание и открытие ожидаемого таймера
- •Функции для работы с ожидаемым таймером
- •Контрольные вопросы
- •Содержание работы
- •Содержание отчета
- •Теоретический материал
- •7.1. Универсальные функции для работы с файлами в операционных системах Microsoft Windows
- •Функция CreateFile
- •Функция CloseHandle
- •Функции ReadFile и WriteFile
- •Механизм отображения файлов на память
- •Создание отображения файла
- •Выполнение отображения файла в память
- •Открытие отображения
- •Отмена отображения файла
- •Принудительная запись измененных данных
- •Обмен через файлы, отображаемые на память
- •Пример приложения, использующего файлы, отображаемые на память
- •Именованные и анонимные каналы
- •Имена каналов
- •Реализации каналов
- •Создание канала
- •Установка соединения с каналом со стороны сервера
- •Пример приложения, использующего каналы передачи данных Pipes
- •Создание канала Mailslot
- •Открытие канала Mailslot
- •Запись сообщений в канал Mailslot
- •Чтение сообщений из канала Mailslot
- •Определение состояния канала Mailslot
- •Изменение состояния канала Mailslot
- •Пример приложения, использующего каналы передачи данных MailSlot
- •Пример приложения, использующего передачу сообщений между процессами
Функции для работы с семафорами
Рассмотрим функции программного интерфейса операционных систем Microsoft Windows, предназначенные для работы с семафорами.
Создание семафора
Для создания семафора приложение должно вызвать функцию CreateSemaphore, прототип которой приведен ниже:
HANDLE CreateSemaphore( |
|
|
|
LPSECURITY_ATTRIBUTES IpSemaphoreAttributes, |
// атрибуты защиты |
|
LONG lInitialCount, |
// начальное значение // счетчика семафора |
|
LONG lMaximumCount, |
// максимальное значение // счетчика семафора |
|
LPCTSTR IpName); |
// адрес строки с именем // семафора |
В качестве атрибутов защиты вы можете передать значение NULL.
Через параметры lInitialCount и lMaximumCount передается соответственно начальное и максимальное значение счетчика, связанного с создаваемым семафором. Начальное значение счетчика lInitialCount должно быть больше или равно нулю и не должно превосходить максимальное значение счетчика, передаваемое через параметр lMaximumCount.
Имя семафора указывается аналогично имени рассмотренного нами ранее объекта Mutex с помощью параметра IpName.
В случае удачного создания семафора функция CreateSemaphore возвращает его идентификатор. В случае возникновения ошибки возвращается значение NULL, при этом код ошибки можно узнать при помощи функции GetLastError.
Так как имена семафоров доступны всем приложениям в системе, возможно возникновение ситуации, когда приложение пытается создать семафор с уже использованным именем. При этом новый семафор не создается, а приложение получает идентификатор для уже существующего семафора. Если возникла такая ситуация, функция GetLastError, вызванная сразу после функции CreateSemaphore, возвращает значение ERROR_ALREADY_EXISTS.
Уничтожение семафора •
Для уничтожения семафора вы должны передать его идентификатор функции CloseHandle; Заметим, что при завершении процесса все созданные им семафоры уничтожаются автоматически.
Открытие семафора
Если семафор используется только для синхронизации задач, созданных в рамках одного приложения, вы можете создать безымянный семафор, указав в качестве параметра IpName функции CreateSemaphore значение NULL. В том случае, когда необходимо синхронизировать задачи разных процессов, следует определить имя семафора. При этом один процесс создает семафор с помощью функции CreateSemaphore, а второй открывает его, получая идентификатор для уже существующего семафора.
Существующий семафор можно открыть функцией OpenSemaphore, прототип которой приведен ниже:
HANDLE OpenSemaphore( |
|
|
|
DWORD fdwAccess, |
// требуемый доступ |
|
BOOL fInherit, |
// флаг наследования |
|
LPCTSTR IpazSemaphoreName); |
// адрес имени семафора |
Флаги доступа, передаваемые через параметр fdwAccess, определяют требуемый уровень доступа к семафору. Этот параметр может быть комбинацией следующих значений:
Значение |
Описание |
SEMAPHORE_ALL_ACCESS |
Указаны все возможные флаги доступа |
SEMAPHORE_MODIFY_STATE |
Возможно изменение значения счетчика семафора функцией ReleaseSemaphore |
SYNCHRONIZE |
Полученный идентифи-катор можно будет использовать в любых функциях ожидания события |
Параметр fInherit определяет возможность наследования полученного идентификатора; Если этот параметр равен TRUE, идентификатор может наследоваться дочерними процессами. Если же он равен FALSE, наследование не допускается.
Через параметр IpszSemaphoreName вы должны передать функции адрес символьной строки, содержащей имя семафора.
Если семафор открыт успешно, функция OpenSemaphore возвращает его идентификатор. При ошибке возвращается значение NULL. Код ошибки вы можете определить при помощи функции GetLastError.
