Condividi tramite


Oggetti processo

Un oggetto processo consente ai gruppi di processi di essere gestiti come unità. Gli oggetti del processo sono oggetti a protezione diretta, condivisibili che controllano gli attributi dei processi associati. Le operazioni eseguite su un oggetto processo interessano tutti i processi associati all'oggetto processo. Alcuni esempi includono l'applicazione di limiti, ad esempio le dimensioni del set di lavoro e la priorità del processo o la terminazione di tutti i processi associati a un processo.

Creazione di processi

Per creare un oggetto processo, usare la funzione CreateJobObject . Quando il processo viene creato, nessun processo è associato al processo.

Per associare un processo a un processo, usare la funzione AssignProcessToJobObject . Dopo che un processo è associato a un processo, l'associazione non può essere interrotta. Un processo può essere associato a più processi in una gerarchia di processi annidati. Per altre informazioni, vedere Processi annidati.

Windows 7, Windows Server 2008 R2, Windows XP con SP3, Windows Server 2008, Windows Vista e Windows Server 2003: Un processo può essere associato a un solo processo. I processi non possono essere annidati. La possibilità di annidare i processi è stata aggiunta in Windows 8 e Windows Server 2012.

È possibile specificare un descrittore di sicurezza per un oggetto processo quando si chiama la funzione CreateJobObject . Per altre informazioni, vedere Sicurezza oggetti processo e diritti di accesso.

Gestione dei processi nei processi

Dopo che un processo è associato a un processo, per impostazione predefinita tutti i processi figlio creati tramite CreateProcess sono associati anche al processo. I processi figlio creati usando Win32_Process.Create non sono associati al processo. Questo comportamento predefinito può essere modificato impostando il limite esteso JOB_OBJECT_LIMIT_BREAKAWAY_OK o JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK per il processo.

  • Se il processo ha il limite esteso JOB_OBJECT_LIMIT_BREAKAWAY_OK e il processo padre è stato creato con il flag di CREATE_BREAKAWAY_FROM_JOB, i processi figlio del processo padre non sono associati al processo.
  • Se il processo ha il limite esteso JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK, i processi figlio di qualsiasi processo padre associato al processo non sono associati al processo. Non è necessario creare processi padre con il flag di CREATE_BREAKAWAY_FROM_JOB.

Se il processo è annidato, le impostazioni di interruzione dei processi padre nella gerarchia influiscono sul fatto che i processi figlio siano associati a un altro processo nella gerarchia. Per altre informazioni, vedere Processi annidati.

Per determinare se un processo è in esecuzione in un processo, usare la funzione IsProcessInJob .

Per terminare tutti i processi attualmente associati a un oggetto processo, usare la funzione TerminateJobObject .

Limiti e notifiche dei processi

Un processo può applicare limiti come le dimensioni del set di lavoro, la priorità del processo e il limite di tempo di fine processo per ogni processo associato al processo. Se un processo associato a un processo tenta di aumentare le dimensioni del set di lavoro o la priorità del processo dal limite stabilito dal processo, le chiamate di funzione hanno esito positivo ma vengono ignorate in modo automatico. Un processo può anche impostare limiti che attivano una notifica quando vengono superati, ma consentono al processo di continuare l'esecuzione.

Per impostare i limiti per un processo, usare la funzione SetInformationJobObject . Per un elenco di possibili limiti che possono essere impostati per un processo, vedere gli argomenti seguenti:

I limiti di sicurezza devono essere impostati singolarmente per ogni processo associato a un oggetto processo. Per altre informazioni, vedere Elaborare diritti di sicurezza e accesso.

Windows XP con SP3 e Windows Server 2003: La funzione SetInformationJobObject può essere usata per impostare limitazioni di sicurezza per tutti i processi associati a un oggetto processo. A partire da Windows Vista, i limiti di sicurezza devono essere impostati singolarmente per ogni processo associato a un oggetto processo.

Se il processo è annidato, i processi padre nella gerarchia influiscono sul limite applicato per il processo. Per altre informazioni, vedere Processi annidati.

Se il processo ha una porta di completamento di I/O associata, può ricevere notifiche quando vengono superati determinati limiti di processo. Il sistema invia messaggi alla porta di completamento quando viene superato un limite o si verificano altri eventi. Per associare una porta di completamento a un processo, usare la funzione SetInformationJobObject con la classe di informazioni sull'oggetto processo JobObjectAssociateCompletionPortInformation e un puntatore a una struttura JOBOBJECT_ASSOCIATE_COMPLETION_PORT . È consigliabile eseguire questa operazione quando il processo è inattivo, per ridurre la possibilità di notifiche mancanti per i processi i cui stati cambiano durante l'associazione della porta di completamento.

Tutti i messaggi vengono inviati direttamente dal processo come se il processo avesse chiamato la funzione PostQueuedCompletionStatus . Un thread deve monitorare la porta di completamento usando la funzione GetQueuedCompletionStatus per raccogliere i messaggi. Si noti che, ad eccezione dei limiti impostati con la classe di informazioni JobObjectNotificationLimitInformation , il recapito dei messaggi alla porta di completamento non è garantito; l'errore di arrivo di un messaggio 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. Per un elenco di messaggi possibili, vedere JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Contabilità delle risorse per i processi

L'oggetto processo registra informazioni di base sulla contabilità per tutti i processi associati, inclusi quelli che hanno terminato. Per recuperare queste informazioni di contabilità, usare la funzione QueryInformationJobObject . Per un elenco delle informazioni di contabilità mantenute per un processo, vedere gli argomenti seguenti:

Se l'oggetto processo viene annidato, le informazioni di contabilità per ogni processo figlio vengono aggregate nel processo padre. Per altre informazioni, vedere Processi annidati.

Gestione degli oggetti processo

Lo stato di un oggetto processo è impostato su segnalato quando tutti i processi vengono terminati perché il limite di tempo di fine del processo specificato è stato superato. Usare WaitForSingleObject o WaitForSingleObjectEx per monitorare l'oggetto processo per questo evento.

Per ottenere un handle per un oggetto processo esistente, usare la funzione OpenJobObject e specificare il nome assegnato all'oggetto al momento della creazione. È possibile aprire solo oggetti processo denominati.

Per chiudere un handle dell'oggetto processo, usare la funzione CloseHandle . Il processo viene eliminato quando l'ultimo handle è stato chiuso e tutti i processi associati sono stati terminati. Tuttavia, se il processo ha il flag JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE specificato, chiudere l'ultimo handle dell'oggetto processo termina tutti i processi associati e quindi elimina l'oggetto processo stesso. Se un processo annidato ha il flag JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE specificato, chiudere l'ultimo handle dell'oggetto processo termina tutti i processi associati al processo e ai relativi processi figlio nella gerarchia.

Gestione di un albero dei processi che usa oggetti processo

A partire da Windows 8 e Windows Server 2012, un'applicazione può usare processi annidati per gestire un albero di processi che usa più di un oggetto processo. Tuttavia, un'applicazione che deve essere eseguita in Windows 7, Windows Server 2008 R2 o versioni precedenti di Windows che non supportano processi nidificati deve gestire l'albero dei processi in altri modi.

Se uno strumento deve gestire un albero di processo che usa oggetti processo e non è possibile usare processi annidati, sia lo strumento che i membri dell'albero del processo devono collaborare. Usare una delle seguenti opzioni:

  • Usare il limite di JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Se lo strumento usa questo limite, non può monitorare un intero albero del processo. Lo strumento può monitorare solo i processi aggiunti al processo. Se questi processi creano processi figlio, non sono associati al processo. In questa opzione i processi figlio possono essere associati ad altri oggetti processo.

  • Usare il limite di JOB_OBJECT_LIMIT_BREAKAWAY_OK. Se lo strumento usa questo limite, può monitorare l'intero albero del processo, ad eccezione dei processi che qualsiasi membro dell'albero si interrompe in modo esplicito dall'albero. Un membro dell'albero può creare un processo figlio in un nuovo oggetto processo chiamando la funzione CreateProcess con il flag CREATE_BREAKAWAY_FROM_JOB, quindi chiamando la funzione AssignProcessToJobObject . In caso contrario, il membro deve gestire i casi in cui AssignProcessToJobObject ha esito negativo.

    Il flag CREATE_BREAKAWAY_FROM_JOB non ha alcun effetto se l'albero non viene monitorato dallo strumento. Pertanto, questa è l'opzione preferita, ma richiede una conoscenza avanzata dei processi monitorati.

  • Impedisci interruzioni di qualsiasi tipo impostando né il JOB_OBJECT_LIMIT_BREAKAWAY_OK né il limite di JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. In questa opzione lo strumento può monitorare l'intero albero del processo. Tuttavia, se un processo figlio tenta di associare se stesso o un altro processo figlio a un processo chiamando AssignProcessToJobObject, la chiamata avrà esito negativo. Se il processo è stato progettato per essere associato a un processo specifico, questo errore potrebbe impedire il corretto funzionamento del processo.