JOBOBJECT_ASSOCIATE_COMPLETION_PORT 構造体 (winnt.h)

完了ポートをジョブに関連付けるために使用される情報が含まれます。 1 つの完了ポートをジョブに関連付けることができます。

構文

typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
  PVOID  CompletionKey;
  HANDLE CompletionPort;
} JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;

メンバー

CompletionKey

ジョブの代わりにメッセージが送信されるときに PostQueuedCompletionStatusdwCompletionKey パラメーターで使用する値。

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 にデクリメントされたことを示します。 たとえば、ジョブに現在アクティブなプロセスが 2 つある場合、システムは両方とも終了した後にこのメッセージを送信します。

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 リソース制限通知に登録されているジョブに関連付けられているプロセスが 1 つ以上の制限を超えたことを示します。 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 (デスクトップ アプリのみ)
Header winnt.h (Windows.h を含む)

こちらもご覧ください

PostQueuedCompletionStatus

QueryInformationJobObject

SetInformationJobObject