Condividi tramite


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;

Membri

CompletionKey

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

CompletionPort

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

Windows 8 e versioni successive, Windows Server 2012 e versioni successive: Specificare NULL per rimuovere l'associazione tra la porta di completamento corrente e il processo.

Osservazioni

Il sistema invia messaggi alla porta di completamento 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 il JobObjectNotificationLimitInformation classe di informazioni, i messaggi sono destinati solo come notifiche e il 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 è 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 dovrebbe 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 questo 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 che è stata richiesta la terminazione del processo.

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

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

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 delle 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, in quanto 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.

Fabbisogno

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)

Vedere anche

PostQueuedCompletionStatus

QueryInformationJobObject

SetInformationJobObject