структура 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)

См. также раздел

PostQueuedCompletionStatus

QueryInformationJobObject

SetInformationJobObject