Поделиться через


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

Порт завершения, используемый в параметре завершения функции postQueuedCompletionStatus при отправке сообщений от имени задания.

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)

См. также

PostQueuedCompletionStatus

QueryInformationJobObject

SetInformationJobObject