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
当代表作业发送消息时,要在
CompletionPort
当代表作业发送消息时,要在 PostQueuedCompletionStatus 函数的 CompletionPort 参数中使用的完成端口。
Windows 8 及更新版本、Windows Server 2012 及更新版本: 指定 NULL 以删除当前完成端口与作业之间的关联。
言论
当发生某些事件时,系统会将消息发送到与作业关联的 I/O 完成端口。 如果作业是嵌套的,则会将消息发送到与触发消息的作业父作业链中的任何作业关联的每个 I/O 完成端口。 所有消息都直接从作业发送,就像作业调用了 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 |
指示与已注册资源限制通知的作业关联的进程已超过一个或多个限制。 通过 JobObjectLimitViolationInformation 使用 QueryInformationJobObject 函数来确定超出的限制。
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) |