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
代表作业发送消息时,PostQueuedCompletionStatus 的 dwCompletionKey 参数中使用的值。
CompletionPort
代表作业发送消息时,PostQueuedCompletionStatus 函数的 CompletionPort 参数中使用的完成端口。
Windows 8、Windows Server 2012、Windows 8.1、Windows Server 2012 R2、Windows 10 和 Windows Server 2016:指定 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 |
指示与已注册资源限制通知的作业关联的进程已超过一个或多个限制。 将 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) |