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
ジョブの代わりにメッセージが送信されるときに、dwCompletionKeyPostQueuedCompletionStatus のパラメーターで使用する値。
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 に減らされたことを示します。 たとえば、ジョブに現在アクティブなプロセスが 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 つ以上の制限を超えたことを示します。
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 を
SetInformationJobObject の