структура 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объекта PostQueuedCompletionStatus при отправке сообщений от имени задания.
CompletionPort
Порт завершения, используемый в параметре CompletionPort функции PostQueuedCompletionStatus при отправке сообщений от имени задания.
Windows 8, Windows Server 2012, Windows 8.1, Windows Server 2012 R2, Windows 10 и Windows Server 2016. Укажите значение NULL, чтобы удалить связь между текущим объектом. порт завершения и задание.
Комментарии
Система отправляет сообщения на порт завершения ввода-вывода, связанный с заданием, при возникновении определенных событий. Если задание является вложенным, сообщение отправляется на каждый порт завершения ввода-вывода, связанный с любым заданием в родительской цепочке заданий задания, которое активировало сообщение. Все сообщения отправляются непосредственно из задания, как если бы задание вызывало функцию PostQueuedCompletionStatus .
Обратите внимание, что, за исключением ограничений, установленных в информационном классе JobObjectNotificationLimitInformation , сообщения предназначены только как уведомления, и их доставка на порт завершения не гарантируется. Сбой при получении сообщения к порту завершения не обязательно означает, что событие не произошло. Уведомления об ограничениях, установленных с помощью 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) |