struttura JOBOBJECT_ASSOCIATE_COMPLETION_PORT (winnt.h)

Contiene informazioni utilizzate per associare una porta di completamento a un processo. È possibile associare una porta di completamento a un processo.

Sintassi

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

Members

CompletionKey

Valore da utilizzare nel parametro dwCompletionKey di PostQueuedCompletionStatus quando i messaggi vengono inviati per conto del processo.

CompletionPort

Porta di completamento da utilizzare nel parametro CompletionPort della funzione PostQueuedCompletionStatus quando i messaggi vengono inviati per conto del processo.

Windows 8, Windows Server 2012, Windows 8.1, Windows Server 2012 R2, Windows 10 e Windows Server 2016: specificare NULL per rimuovere l'associazione tra l'oggetto corrente porta di completamento e processo.

Commenti

Il sistema invia messaggi alla porta di completamento di I/O associata a un processo quando si verificano determinati eventi. Se il processo è annidato, il messaggio viene inviato a ogni porta di completamento di I/O associata a qualsiasi processo nella catena di processi padre del processo che ha attivato il messaggio. Tutti i messaggi vengono inviati direttamente dal processo come se il processo avesse chiamato la funzione PostQueuedCompletionStatus .

Si noti che, ad eccezione dei limiti impostati con la classe di informazioni JobObjectNotificationLimitInformation , i messaggi sono destinati solo come notifiche e il loro recapito alla porta di completamento non è garantito. L'errore di un messaggio per arrivare alla porta di completamento non significa necessariamente che l'evento non si sia verificato. Le notifiche per i limiti impostati con JobObjectNotificationLimitInformation sono garantite per arrivare alla porta di completamento.

Un thread deve monitorare la porta di completamento usando la funzione GetQueuedCompletionStatus per raccogliere i messaggi. Il thread riceve informazioni nei parametri GetQueuedCompletionStatus illustrati nella tabella seguente.

Parametro Informazioni ricevute
lpCompletionKey Valore specificato in CompletionKey durante l'associazione di porte di completamento. Se una porta di completamento è associata a più processi, CompletionKey deve aiutare il chiamante a determinare quale porta di completamento sta inviando un messaggio.
lpOverlapped Valore specifico del messaggio. Per altre informazioni, vedere la tabella seguente di identificatori di messaggio.
LpNumberOfBytes Identificatore del messaggio che indica quale evento correlato al processo si è verificato. Per altre informazioni, vedere la tabella seguente di identificatori di messaggio.
 

I messaggi seguenti possono essere inviati alla porta di completamento. Si noti che per i messaggi che restituiscono un identificatore di processo, non è possibile garantire che il processo sia ancora attivo o che l'identificatore non sia stato riciclato (assegnato a un nuovo processo dopo la terminazione) a meno che non si mantenga un handle aperto per il processo.

Identificatore del messaggio Descrizione
JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS Indica che un processo associato al processo è stato chiuso con un codice di uscita che indica un'uscita anomala (vedere l'elenco che segue questa tabella).

Il valore di lpOverlapped è l'identificatore del processo di uscita.

JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT Indica che il limite del processo attivo è stato superato.

Il valore di lpOverlapped è NULL.

JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO Indica che il numero di processi attivi è stato decrementato su 0. Ad esempio, se il processo ha attualmente due processi attivi, il sistema invia questo messaggio dopo che entrambi terminano.

Il valore di lpOverlapped è NULL.

JOB_OBJECT_MSG_END_OF_JOB_TIME Indica che l'opzione JOB_OBJECT_POST_AT_END_OF_JOB è attiva e che è stato raggiunto il limite di tempo di fine processo. Al momento della pubblicazione di questo messaggio, il limite di tempo viene annullato e i processi del processo possono continuare a essere eseguiti.

Il valore di lpOverlapped è NULL.

JOB_OBJECT_MSG_END_OF_PROCESS_TIME Indica che un processo ha superato un limite di tempo per processo. Il sistema invia questo messaggio dopo la chiusura del processo.

Il valore di lpOverlapped è l'identificatore del processo che ha superato il limite.

JOB_OBJECT_MSG_EXIT_PROCESS Indica che è stato chiuso un processo associato al processo.

Il valore di lpOverlapped è l'identificatore del processo di uscita.

JOB_OBJECT_MSG_JOB_MEMORY_LIMIT Indica che un processo associato al processo ha causato il superamento del limite di memoria a livello di processo (se è attivo).

Il valore di lpOverlapped specifica l'identificatore del processo che ha tentato di superare il limite. Il sistema non invia questo messaggio se il processo non ha ancora segnalato l'identificatore del processo.

JOB_OBJECT_MSG_NEW_PROCESS Indica che un processo è stato aggiunto al processo. Vengono segnalati anche i processi aggiunti a un processo al momento in cui viene associata una porta di completamento.

Il valore di lpOverlapped è l'identificatore del processo aggiunto al processo.

JOB_OBJECT_MSG_NOTIFICATION_LIMIT Indica che un processo associato a un processo registrato per le notifiche relative al limite di risorse ha superato uno o più limiti. Usare la funzione QueryInformationJobObject con JobObjectLimitViolationInformation per determinare quale limite è stato superato.

Il valore di lpOverlapped è l'identificatore del processo che ha superato il limite. Il sistema non invia questo messaggio se il processo non ha ancora segnalato l'identificatore del processo.

JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT Indica che un processo associato al processo ha superato il limite di memoria (se è attivo).

Il valore di lpOverlapped è l'identificatore del processo che ha superato il limite. Il sistema non invia questo messaggio se il processo non ha ancora segnalato l'identificatore del processo.

 

I codici di uscita seguenti indicano un'uscita anomala:

È necessario prestare attenzione quando si usano i messaggi JOB_OBJECT_MSG_NEW_PROCESS e JOB_OBJECT_MSG_EXIT_PROCESS, perché possono verificarsi race condition. Ad esempio, se i processi vengono avviati e usciti attivamente all'interno di un processo e si sta eseguendo il processo di assegnazione di una porta di completamento al processo, è possibile che si verifichino messaggi per i processi i cui stati cambiano durante l'associazione della porta di completamento. Per questo motivo, è consigliabile associare una porta di completamento a un processo quando il processo è inattivo.

Requisiti

Requisito Valore
Client minimo supportato Windows XP [solo app desktop]
Server minimo supportato Windows Server 2003 [solo app desktop]
Intestazione winnt.h (include Windows.h)

Vedi anche

PostQueuedCompletionStatus

QueryInformationJobObject

SetInformationJobObject