структура JOBOBJECT_ASSOCIATE_COMPLETION_PORT (winnt.h)
Содержит сведения, используемые для связывания порта завершения с заданием. Можно связать один порт завершения с заданием.
Синтаксис
typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
PVOID CompletionKey;
HANDLE CompletionPort;
} JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
Члены
CompletionKey
Значение, используемое в параметре dwCompletionKey dwCompletionKeyPostQueuedCompletionStatus при отправке сообщений от имени задания.
CompletionPort
Порт завершения, используемый в
Windows 8 и более поздней версии Windows Server 2012 и более поздней версии: Укажите NULL, чтобы удалить связь между текущим портом завершения и заданием.
Замечания
Система отправляет сообщения в порт завершения ввода-вывода, связанный с заданием при возникновении определенных событий. Если задание вложено, сообщение отправляется на каждый порт завершения ввода-вывода, связанный с любым заданием в родительской цепочке заданий задания, активировав сообщение. Все сообщения отправляются непосредственно из задания, как если бы задание вызывало функцию PostQueuedCompletionStatus.
Обратите внимание, что за исключением ограничений, установленных в классе сведений JobObjectNotificationLimit Information, сообщения предназначены только в качестве уведомлений и их доставки в порт завершения не гарантируется. Сбой сообщения при поступлении на порт завершения не обязательно означает, что событие не произошло. Уведомления о ограничениях, заданных с помощью JobObjectNotificationLimitInformation, гарантированно прибывают в порт завершения.
Поток должен отслеживать порт завершения с помощью функции GetQueuedCompletionStatus для сбора сообщений. Поток получает сведения в параметрах GetQueuedCompletionStatus, показанных в следующей таблице.
Параметр | Полученная информация |
---|---|
lpCompletionKey | Значение, указанное в CompletionKey во время сопоставления портов завершения. Если порт завершения связан с несколькими заданиями, CompletionKey должно помочь вызывающему объекту определить, какой порт завершения отправляет сообщение. |
lpOverlapped | Значение для конкретного сообщения. Дополнительные сведения см. в следующей таблице идентификаторов сообщений. |
LpNumberOfBytes | Идентификатор сообщения, указывающий событие, связанное с заданием. Дополнительные сведения см. в следующей таблице идентификаторов сообщений. |
Следующие сообщения можно отправить на порт завершения. Обратите внимание, что для сообщений, возвращающих идентификатор процесса, вы не можете гарантировать, что этот процесс по-прежнему активен или что идентификатор не был переработан (назначен новому процессу после завершения), если вы не сохраняете открытый дескриптор процесса.
Идентификатор сообщения | Описание |
---|---|
JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS |
Указывает, что процесс, связанный с заданием, завершился с кодом выхода, указывающим на ненормальный выход (см. список ниже этой таблицы).
Значение lpOverlapped является идентификатором выходного процесса. |
JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT |
Указывает, что превышено ограничение активного процесса.
Значение lpOverlapped равно NULL. |
JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO |
Указывает, что число активных процессов было отложено до 0. Например, если задание в настоящее время имеет два активных процесса, система отправляет это сообщение после их завершения.
Значение lpOverlapped равно NULL. |
JOB_OBJECT_MSG_END_OF_JOB_TIME |
Указывает, что параметр JOB_OBJECT_POST_AT_END_OF_JOB действует и достигнуто ограничение времени окончания задания. После публикации этого сообщения ограничение времени отменяется, а процессы задания могут продолжать выполняться.
Значение lpOverlapped равно NULL. |
JOB_OBJECT_MSG_END_OF_PROCESS_TIME |
Указывает, что процесс превысил ограничение времени на каждый процесс. Система отправляет это сообщение после завершения процесса.
Значение lpOverlapped является идентификатором процесса, превышающего его ограничение. |
JOB_OBJECT_MSG_EXIT_PROCESS |
Указывает, что процесс, связанный с заданием, завершился.
Значение lpOverlapped является идентификатором выходного процесса. |
JOB_OBJECT_MSG_JOB_MEMORY_LIMIT |
Указывает, что процесс, связанный с заданием, привел к превышению ограничения памяти на уровне задания (если он действует).
Значение lpOverlapped указывает идентификатор процесса, который пытался превысить предел. Система не отправляет это сообщение, если процесс еще не сообщил о своем идентификаторе процесса. |
JOB_OBJECT_MSG_NEW_PROCESS |
Указывает, что процесс добавлен в задание. Процессы, добавленные к заданию во время связи порта завершения, также сообщаются.
Значение lpOverlapped является идентификатором процесса, добавленного в задание. |
JOB_OBJECT_MSG_NOTIFICATION_LIMIT |
Указывает, что процесс, связанный с заданием, зарегистрированным для уведомлений об ограничении ресурсов, превысил одно или несколько ограничений. Используйте функцию QueryInformationJobObject с JobObjectLimitViolationInformation, чтобы определить, какой предел превышен.
Значение lpOverlapped является идентификатором процесса, превышающего его предел. Система не отправляет это сообщение, если процесс еще не сообщил о своем идентификаторе процесса. |
JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT |
Указывает, что процесс, связанный с заданием, превысил предел памяти (если он действует).
Значение lpOverlapped является идентификатором процесса, превышающего его предел. Система не отправляет это сообщение, если процесс еще не сообщил о своем идентификаторе процесса. |
Следующие коды выхода указывают на ненормальный выход:
При использовании JOB_OBJECT_MSG_NEW_PROCESS и JOB_OBJECT_MSG_EXIT_PROCESS сообщений необходимо быть осторожными, так как могут возникнуть условия гонки. Например, если процессы активно запускаются и завершаются в задании, и вы находитесь в процессе назначения порта завершения заданию, вы можете пропустить сообщения для процессов, состояния которых изменяются во время сопоставления порта завершения. По этой причине лучше связать порт завершения с заданием, когда задание неактивно.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows XP [только классические приложения] |
минимальный поддерживаемый сервер | Windows Server 2003 [только классические приложения] |
заголовка | winnt.h (включая Windows.h) |