JOBOBJECT_ASSOCIATE_COMPLETION_PORT-Struktur (winnt.h)

Enthält Informationen, die zum Zuordnen eines Abschlussports zu einem Auftrag verwendet werden. Sie können einem Auftrag einen Abschlussport zuordnen.

Syntax

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

Member

CompletionKey

Der Wert, der im dwCompletionKey-Parameter von PostQueuedCompletionStatus verwendet werden soll, wenn Nachrichten im Auftrag des Auftrags gesendet werden.

CompletionPort

Der Abschlussport, der im CompletionPort-Parameter der PostQueuedCompletionStatus-Funktion verwendet werden soll, wenn Nachrichten im Auftrag des Auftrags gesendet werden.

Windows 8, Windows Server 2012, Windows 8.1, Windows Server 2012 R2, Windows 10 und Windows Server 2016: Geben Sie NULL an, um die Zuordnung zwischen dem aktuellen zu entfernen. Abschlussport und der Auftrag.

Hinweise

Das System sendet Nachrichten an den E/A-Abschlussport, der einem Auftrag zugeordnet ist, wenn bestimmte Ereignisse auftreten. Wenn der Auftrag geschachtelt ist, wird die Nachricht an jeden E/A-Abschlussport gesendet, der jedem Auftrag in der übergeordneten Auftragskette des Auftrags zugeordnet ist, der die Nachricht ausgelöst hat. Alle Nachrichten werden direkt vom Auftrag gesendet, als ob der Auftrag die PostQueuedCompletionStatus-Funktion aufgerufen hätte.

Beachten Sie, dass Nachrichten mit Ausnahme von Grenzwerten, die mit der Informationsklasse JobObjectNotificationLimitInformation festgelegt wurden, nur als Benachrichtigungen gedacht sind und ihre Übermittlung an den Vervollständigungsport nicht garantiert ist. Wenn eine Nachricht nicht am Abschlussport eintrifft, bedeutet dies nicht unbedingt, dass das Ereignis nicht aufgetreten ist. Benachrichtigungen für grenzwerte, die mit JobObjectNotificationLimitInformation festgelegt sind, werden garantiert am Abschlussport eintreffen.

Ein Thread muss den Vervollständigungsport mithilfe der GetQueuedCompletionStatus-Funktion überwachen, um die Nachrichten abzurufen. Der Thread empfängt Informationen in den GetQueuedCompletionStatus-Parametern , die in der folgenden Tabelle angezeigt werden.

Parameter Empfangene Informationen
lpCompletionKey Der in CompletionKey während der Zuordnung "completion-port" angegebene Wert. Wenn ein Abschlussport mehreren Aufträgen zugeordnet ist, sollte CompletionKey dem Aufrufer helfen zu bestimmen, welcher Abschlussport eine Nachricht sendet.
lpOverlapped Nachrichtenspezifischer Wert. Weitere Informationen finden Sie in der folgenden Tabelle der Nachrichtenbezeichner.
LpNumberOfBytes Der Nachrichtenbezeichner, der angibt, welches auftragsbezogene Ereignis aufgetreten ist. Weitere Informationen finden Sie in der folgenden Tabelle der Nachrichtenbezeichner.
 

Die folgenden Nachrichten können an den Abschlussport gesendet werden. Beachten Sie, dass Sie bei Nachrichten, die einen Prozessbezeichner zurückgeben, nicht garantieren können, dass dieser Prozess weiterhin aktiv ist oder dass der Bezeichner nicht wiederverwendet wurde (einem neuen Prozess nach beendigung zugewiesen), es sei denn, Sie behalten ein offenes Handle für den Prozess bei.

Nachrichten-ID BESCHREIBUNG
JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS Gibt an, dass ein dem Auftrag zugeordneter Prozess mit einem Exitcode beendet wurde, der auf einen ungewöhnlichen Exit hinweist (siehe die Liste nach dieser Tabelle).

Der Wert von lpOverlapped ist der Bezeichner des beendenden Prozesses.

JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT Gibt an, dass der Grenzwert für aktive Prozesse überschritten wurde.

Der Wert von lpOverlapped ist NULL.

JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO Gibt an, dass die Anzahl der aktiven Prozesse auf 0 reduziert wurde. Wenn der Auftrag beispielsweise derzeit über zwei aktive Prozesse verfügt, sendet das System diese Nachricht, nachdem beide beendet wurden.

Der Wert von lpOverlapped ist NULL.

JOB_OBJECT_MSG_END_OF_JOB_TIME Gibt an, dass die Option JOB_OBJECT_POST_AT_END_OF_JOB aktiviert ist und das Ende des Auftrags erreicht wurde. Nach dem Veröffentlichen dieser Nachricht wird das Zeitlimit abgebrochen, und die Prozesse des Auftrags können weiterhin ausgeführt werden.

Der Wert von lpOverlapped ist NULL.

JOB_OBJECT_MSG_END_OF_PROCESS_TIME Gibt an, dass ein Prozess ein Zeitlimit pro Prozess überschritten hat. Das System sendet diese Nachricht, nachdem die Prozessbeendigung angefordert wurde.

Der Wert von lpOverlapped ist der Bezeichner des Prozesses, der seinen Grenzwert überschritten hat.

JOB_OBJECT_MSG_EXIT_PROCESS Gibt an, dass ein Prozess, der dem Auftrag zugeordnet ist, beendet wurde.

Der Wert von lpOverlapped ist der Bezeichner des beendenden Prozesses.

JOB_OBJECT_MSG_JOB_MEMORY_LIMIT Gibt an, dass ein dem Auftrag zugeordneter Prozess dazu geführt hat, dass der Auftrag den auftragsweiten Arbeitsspeichergrenzwert überschreitet (sofern vorhanden).

Der Wert von lpOverlapped gibt den Bezeichner des Prozesses an, der versucht hat, den Grenzwert zu überschreiten. Das System sendet diese Nachricht nicht, wenn der Prozess seinen Prozessbezeichner noch nicht gemeldet hat.

JOB_OBJECT_MSG_NEW_PROCESS Gibt an, dass dem Auftrag ein Prozess hinzugefügt wurde. Prozesse, die einem Auftrag zum Zeitpunkt der Zuordnung eines Abschlussports hinzugefügt wurden, werden ebenfalls gemeldet.

Der Wert von lpOverlapped ist der Bezeichner des Prozesses, der dem Auftrag hinzugefügt wurde.

JOB_OBJECT_MSG_NOTIFICATION_LIMIT Gibt an, dass ein Prozess, der einem Auftrag zugeordnet ist, der für Ressourcenlimitbenachrichtigungen registriert wurde, einen oder mehrere Grenzwerte überschritten hat. Verwenden Sie die QueryInformationJobObject-Funktion mit JobObjectLimitViolationInformation, um zu bestimmen, welcher Grenzwert überschritten wurde.

Der Wert von lpOverlapped ist der Bezeichner des Prozesses, der seinen Grenzwert überschritten hat. Das System sendet diese Nachricht nicht, wenn der Prozess seinen Prozessbezeichner noch nicht gemeldet hat.

JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT Gibt an, dass ein Prozess, der dem Auftrag zugeordnet ist, seinen Arbeitsspeichergrenzwert überschritten hat (sofern vorhanden).

Der Wert von lpOverlapped ist der Bezeichner des Prozesses, der seinen Grenzwert überschritten hat. Das System sendet diese Nachricht nicht, wenn der Prozess seinen Prozessbezeichner noch nicht gemeldet hat.

 

Die folgenden Exitcodes weisen auf einen ungewöhnlichen Exit hin:

Sie müssen bei der Verwendung der JOB_OBJECT_MSG_NEW_PROCESS- und JOB_OBJECT_MSG_EXIT_PROCESS-Nachrichten vorsichtig sein, da Racebedingungen auftreten können. Für instance: Wenn Prozesse aktiv innerhalb eines Auftrags gestartet und beendet werden und Sie gerade einen Abschlussport für den Auftrag zuweisen, können Nachrichten für Prozesse fehlen, deren Status sich während der Zuordnung des Abschlussports ändern. Aus diesem Grund empfiehlt es sich, einem Auftrag einen Abschlussport zuzuordnen, wenn der Auftrag inaktiv ist.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [nur Desktop-Apps]
Kopfzeile winnt.h (windows.h einschließen)

Weitere Informationen

PostQueuedCompletionStatus

QueryInformationJobObject

SetInformationJobObject