Книга: Системное программирование в среде Windows
Ожидание завершения процесса
Ожидание завершения процесса
Простейшим, но наряду с этим и обладающим наиболее ограниченными возможностями, методом синхронизации с другим процессом является ожидание его завершения. Представленные ниже стандартные функции ожидания Windows обладают рядом интересных свойств.
• Функции ожидания могут работать с самыми различными типами объектов; дескрипторы процессов являются лишь самым первым из рассматриваемых нами примеров применения этих функций.
• Эти функции могут ожидать завершения одного процесса, первого из нескольких указанных процессов или всех процессов, образующих группу.
• Существует возможность устанавливать конечный интервал ожидания (time-out).
Обе рассмотренных ниже функции ожидают перехода объекта синхронизации в сигнальное состояние. Например, система переводит процесс в сигнальное состояние, когда он завершается или его выполнение прекращается извне. Функциями ожидания, которые мы будем впоследствии неоднократно использовать, являются следующие функции:
DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds)
DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles, BOOL fWaitAll, DWORD dwMilliseconds)
Возвращаемое значение: указывает причину завершения ожидания или, в случае ошибки, равно 0xFFFFFFFF (для получения более подробной информации используйте функцию GetLastError).
В аргументах этих функций указывается либо дескриптор одиночного процесса (hObject), либо дескрипторы ряда отдельных объектов, хранящиеся в массиве, на который указывает указатель lpHandles. Значение параметра nCount, определяющего размер массива, не должно превышать значение MAXIMUM_WAIT_OBJECTS (определено равным 64 в файле WINNT.Н).
dwMilliseconds — число миллисекунд интервала ожидания. Если значение этого параметра равно 0, то возврат из функции осуществляется сразу же после проверки состояния указанного объекта, что позволяет программе опрашивать процессы для определения их состояния завершения. Если же значение этого параметра равно INFINITE, то ожидание длится до тех пор, пока ожидаемый процесс не завершится.
fWaitAll — параметр второй функции, указывающий (если его значение равно TRUE) на необходимость ожидания завершения всех процессов, а не только одного.
Возможными возвращаемыми значениями этой функции в случае ее успешного завершения являются следующие:
• WAIT_OBJECT_0 — означает, что указанный объект перешел в сигнальное состояние (в случае функции WaitForSingleObject) или что одновременно все nCount объектов перешли в сигнальное состояние (в специальном случае функции WaitForMultipleObject, когда значение параметра fWaitAll равно TRUE).
• WAIT_OBJECT_0+n, где 0 ? n < nCount — вычтите значение WAIT_OBJECT_0 из возвращенного значения, чтобы определить, выполнение какого именно процесса завершилось, когда ожидается завершение выполнения любого из группы процессов. Если в сигнальное состояние перешли несколько объектов, то возвращается наименьшее из возможных значений. WAIT_ABANDONED является возможным базовым значением в случае использования дескрипторов мьютексов; см. главу 8.
• WAIT_TIMEOUT — указывает на то, что в течение отведенного периода ожидания сигнализируемый объект (объекты) не смогли удовлетворить условию ожидания.
• WAIT_FAILED — означает неудачное завершение функции, вызванное, например, тем, что у дескриптора отсутствовали права доступа SYNCHRONIZE.
• WAIT_ABANDONED_0 — это значение невозможно в случае процессов и рассматривается в главе 8 при рассмотрении мьютексов.
Для определения кода завершения процесса используется функция GetExitCodeProcess, описанная в предыдущем разделе.
- Процессы и потоки Windows
- Создание процесса
- Счетчики дескрипторов процессов
- Идентификаторы процессов
- Дублирование дескрипторов
- Завершение и прекращение выполнения процесса
- Ожидание завершения процесса
- Блоки и строки окружения
- Пример: параллельный поиск указанного текстового шаблона
- Процессы в многопроцессорной среде
- Временные характеристики процесса
- Пример: временные характеристики процессов
- Генерация управляющих событий консоли
- Пример: простое управление задачами
- Объекты задач
- Резюме
- Упражнения
- Ожидание процесса
- Глава пятая. Затянувшееся ожидание
- 10.5.1. Запуск и ожидание с помощью system()
- ГЛАВА 6 Управление процессами
- Ожидание завершения потока
- Ожидание порта завершения ввода
- Альтернативы портам завершенияввода
- 4.1.2. Ожидание завершения потоков
- 3.4. Завершение процесса
- 3.4.1. Ожидание завершения процесса
- 7.4 ОЖИДАНИЕ ЗАВЕРШЕНИЯ ВЫПОЛНЕНИЯ ПРОЦЕССА
- Пример 11-22. Ожидание завершения процесса перед тем как продолжить работу